Matriks numpy ke array


149

Saya menggunakan numpy. Saya memiliki matriks dengan 1 kolom dan baris N dan saya ingin mendapatkan array dengan elemen N.

Misalnya, jika ada M = matrix([[1], [2], [3], [4]]), saya ingin mendapatkannya A = array([1,2,3,4]).

Untuk mencapainya, saya menggunakan A = np.array(M.T)[0]. Adakah yang tahu cara yang lebih elegan untuk mendapatkan hasil yang sama?

Terima kasih!


Jawaban:


192

Jika Anda ingin sesuatu yang sedikit lebih mudah dibaca, Anda dapat melakukan ini:

A = np.squeeze(np.asarray(M))

Setara, Anda juga bisa melakukannya:, A = np.asarray(M).reshape(-1)tapi itu agak kurang mudah dibaca.


9
Kata-kata kasar sedikit di pihak saya ... mengapa numpy memiliki array dan matriks sebagai entitas yang terpisah. Ini IMHO begitu unpythonic. Terima kasih atas tip ini @ Jo.
Naijaba

6
@Naijaba - Untuk apa nilainya, kelas matriks secara efektif (tetapi tidak secara formal) didepresiasi. Sebagian besar ada untuk tujuan sejarah. Menghapus numpy.matrixadalah sedikit masalah yang diperdebatkan, tetapi para pengembang numpy sangat setuju dengan Anda bahwa memiliki keduanya adalah unpythonic dan menjengkelkan karena sejumlah alasan. Namun, jumlah kode lama yang tidak terawat "in the wild" yang digunakan matrixmembuatnya sulit untuk sepenuhnya menghapusnya.
Joe Kington

1
Belum lagi, perkalian matriks benar hanya ditambahkan untuk array di Numpy 1.10, dan pada dasarnya masih dalam versi beta. Ini berarti bahwa banyak orang (termasuk saya) masih harus menggunakan matriks daripada array untuk menyelesaikan apa yang ingin kita lakukan. docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Georges Oates Larsen

1
Matriks yang jarang adalah dasar untuk pembelajaran mesin yang efisien-memori (misalnya, sklearn). Bahkan ada beberapa sparse matrixtipe berbeda scipy, yang memungkinkan akses efisien melalui baris atau kolom. Saya membayangkan ini mungkin menjadi masalah untuk menggabungkan konsep-konsep matriks dan array. Yang mengatakan, saya bertanya-tanya apakah mungkin ada sparse arraytipe diperkenalkan juga dan apakah ada rencana untuk melakukan itu. Ada petunjuk?
pms

Saya pikir .flatten () berfungsi dan .squeeze (), selama Anda menginginkan array 1D pada akhirnya.
kata

122

6
Saya pikir jawaban ini lebih baik daripada jawaban yang diterima, kinerja-bijaksana, dan kesederhanaan
dariush

M.A1 bagus, implementasi yang sama dengan "ravel" dan "ratakan" dan dalam hal ini tidak menyebabkan salinan data A sehingga tetap terkait dengan M yang dapat menyebabkan kejutan jika A dan / atau M bisa berubah. M. flat alternatif asli yang mengembalikan generator "flatiter" (semantik read-only) np.squeeze (M) # memberikan pandangan menghilangkan dimensi ukuran 1, ok di sini juga tetapi tidak dijamin 1-d untuk M umum np.reshape ( M, -1) # biasanya berupa tampilan tergantung pada kompatibilitas bentuk, "-1" ini adalah cara bundaran untuk melakukan A1 / ravel / flatten
jayprich

13
A, = np.array(M.T)

tergantung apa yang Anda maksud dengan keanggunan saya kira tapi itulah yang akan saya lakukan


11

Anda dapat mencoba varian berikut:

result=np.array(M).flatten()

7
np.array(M).ravel()

Jika Anda peduli kecepatan; Tetapi jika Anda peduli dengan memori:

np.asarray(M).ravel()

Itu akan meningkatkan kualitas jawaban Anda jika Anda menjelaskan alasannya
Milo Wielondek

6

Atau Anda dapat mencoba menghindari beberapa temps dengan

A = M.view(np.ndarray)
A.shape = -1

2

Pertama, Mv = numpy.asarray(M.T) yang memberi Anda array 4x1 tetapi 2D.

Kemudian, lakukan A = Mv[0,:], yang memberi Anda apa yang Anda inginkan. Anda bisa menempatkan mereka bersama, sebagai numpy.asarray(M.T)[0,:].


2

Ini akan mengubah matriks menjadi array

A = np.ravel(M).T

0

fungsi ravel () dan flatten () dari numpy adalah dua teknik yang akan saya coba di sini. Saya ingin menambahkan posting yang dibuat oleh Joe , Siraj , bubble , dan Kevad .

Berlepasan:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

Meratakan:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()lebih cepat , karena ini adalah fungsi tingkat pustaka yang tidak membuat salinan array. Namun, setiap perubahan dalam array A akan membawa dirinya sendiri ke array asli M jika Anda menggunakannumpy.ravel() .

numpy.flatten()lebih lambat darinumpy.ravel() . Tetapi jika Anda menggunakan numpy.flatten()untuk membuat A, maka perubahan dalam A tidak akan terbawa ke array M asli .

numpy.squeeze()dan M.reshape(-1)lebih lambat dari numpy.flatten()dan numpy.ravel().

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.