2010-07-26 52 views
104

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 nhận được một mảng từ với N yếu tố. Ví dụ: nếu tôi có M = matrix([[1], [2], [3], [4]]), tôi muốn nhận A = array([1,2,3,4]).Ma trận Numpy thành mảng

Để đạt được điều đó, 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!

+0

Ivnerse câu hỏi: [chuyển đổi một mảng NumPy 2D sang ma trận 2D NumPy] (http://stackoverflow.com/questions/17443620/convert-a-2d -numpy-array-to-a-2d-numpy-matrix) –

Trả lời

125

Nếu bạn muốn một cái gì đó một chút dễ đọc hơn, 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 đó là một chút ít dễ đọc.

+4

Ít rant trên một phần của tôi ... tại sao không có mảng có mảng và ma trận như các thực thể riêng biệt. Nó là như vậy IMHO unpythonic. Cảm ơn về mẹo này @Joe. – Naijaba

+5

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

+1

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

5

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

A = M.view(np.ndarray) 
A.shape = -1 
10
A, = np.array(M.T) 

phụ thuộc những gì bạn có nghĩa là bởi sự thanh lịch i giả nhưng đó là những gì tôi sẽ làm gì

4

Bạn có thể thử các biến thể sau đây:

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

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

np.asarray(M).ravel() 
1

Đầ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,:].

0

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

A = np.ravel(M).T 
Các vấn đề liên quan