Ma trận Numpy để mảng


149

Tôi đang sử dụng numpy. Tôi có một ma trận với 1 cột và N hàng và tôi muốn lấy một mảng từ với N phần tử.

Ví dụ, nếu tôi có M = matrix([[1], [2], [3], [4]]), tôi muốn lấy A = array([1,2,3,4]).

Để đạt được nó, tôi sử dụng A = np.array(M.T)[0]. Có ai biết một cách thanh lịch hơn để có được kết quả tương tự?

Cảm ơn!


Câu trả lời:


192

Nếu bạn muốn thứ gì đó dễ đọc hơn một chút, bạn có thể làm điều này:

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

Tương tự, bạn cũng có thể làm : A = np.asarray(M).reshape(-1), nhưng điều đó dễ đọc hơn một chút.


9
Ít ỏi về phía tôi ... tại sao numpy có mảng và ma trận như các thực thể riêng biệt. Nó là IMHO unpythonic. Cảm ơn vì mẹo này @Joe.
Naijaba

6
@Naijaba - Đối với những gì nó có giá trị, lớp ma trận được khấu hao một cách hiệu quả (nhưng không chính thức). Nó chủ yếu dành cho mục đích lịch sử. Loại bỏ numpy.matrixlà một vấn đề gây tranh cãi, nhưng các nhà phát triển numpy rất đồng ý với bạn rằng có cả hai là không linh hoạt và gây phiền nhiễu cho một loạt các lý do. Tuy nhiên, số lượng mã cũ, không rõ ràng "trong tự nhiên" sử dụng matrixgây khó khăn cho việc loại bỏ hoàn toàn.
Joe Kington

1
Chưa kể, phép nhân ma trận thực sự chỉ được thêm vào cho các mảng trong Numpy 1.10 và về cơ bản vẫn là bản beta. Điều này có nghĩa là rất nhiều người (bao gồm cả bản thân tôi) vẫn phải sử dụng ma trận thay vì mảng để hoàn thành những gì chúng ta muốn thực hiện. docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Georges Oates Larsen

1
Ma trận thưa thớt là nền tảng cho việc học máy hiệu quả bộ nhớ (ví dụ sklearn:). Trong thực tế, có nhiều sparse matrixloại khác nhau scipy, cho phép truy cập hiệu quả thông qua các hàng hoặc cột. Tôi tưởng tượng điều này có thể là một vấn đề cho việc hợp nhất các khái niệm về ma trận và mảng. Điều đó nói rằng, tôi tự hỏi liệu có thể được giới thiệu một sparse arrayloại là tốt và liệu có bất kỳ kế hoạch để làm điều đó. Bất kì manh mối nào?
pms

Tôi nghĩ .flatten () hoạt động tốt như .squeeze (), miễn là bạn muốn có một mảng 1D cuối cùng.
lời giới thiệu

122

6
Tôi nghĩ rằng câu trả lời này tốt hơn câu trả lời được chấp nhận, thông minh về hiệu suất và sự đơn giản
dariush

M.A1 là tuyệt vời, thực hiện tương tự như "ravel" và "flatten" và trong trường hợp này không gây ra bất kỳ bản sao dữ liệu A nào do đó vẫn được liên kết với M có thể gây bất ngờ nếu A và / hoặc M có thể thay đổi. Trình tạo trả lại "phẳng" chính xác của M.flat (ngữ nghĩa chỉ đọc) np.squeeze (M) # cung cấp chế độ xem loại bỏ kích thước của kích thước 1, cũng ở đây nhưng không được bảo đảm là 1-d cho M np.reshape chung ( M, -1) # thường là chế độ xem tùy thuộc vào khả năng tương thích hình dạng, "-1" này là một cách làm tròn để thực hiện A1 / ravel / flatten
jayprich

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

tôi phụ thuộc vào ý của bạn bởi sự tao nhã tôi cho rằng nhưng đó là những gì tôi sẽ làm


11

Bạn có thể thử biến thể sau:

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

7
np.array(M).ravel()

Nếu bạn quan tâm đến tốc độ; Nhưng nếu bạn quan tâm đến bộ nhớ:

np.asarray(M).ravel()

Nó sẽ cải thiện chất lượng câu trả lời của bạn nếu bạn giải thích lý do
Milo Wielondek

6

Hoặc bạn có thể cố gắng tránh một số temps với

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

2

Đầu tiên, Mv = numpy.asarray(M.T)cung cấp cho bạn một mảng 4x1 nhưng 2D.

Sau đó, thực hiện A = Mv[0,:], cung cấp cho bạn những gì bạn muốn. Bạn có thể đặt chúng lại với nhau, như numpy.asarray(M.T)[0,:].


2

Điều này sẽ chuyển đổi ma trận thành mảng

A = np.ravel(M).T

0

Hàm ravel ()flatten () từ numpy là hai kỹ thuật mà tôi sẽ thử ở đây. Tôi sẽ muốn thêm vào các bài viết được thực hiện bởi Joe , Siraj , bong bóngKevad .

Ravel:

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

Làm phẳng:

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

numpy.ravel()là nhanh hơn , vì nó là một hàm cấp thư viện không tạo ra bất kỳ bản sao nào của mảng. Tuy nhiên, bất kỳ thay đổi nào trong mảng A sẽ tự chuyển sang mảng M ban đầu nếu bạn đang sử dụngnumpy.ravel() .

numpy.flatten()là chậm hơn so vớinumpy.ravel() . Nhưng nếu bạn đang sử dụng numpy.flatten()để tạo A, thì những thay đổi trong A sẽ không được chuyển sang mảng M ban đầu .

numpy.squeeze()M.reshape(-1)chậm hơn numpy.flatten()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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.