2013-07-25 19 views
17

Tôi có một câu hỏi liên quan đến việc chuyển đổi giữa (N,) mảng thứ nguyên và (N, 1) mảng thứ nguyên. Ví dụ, y là (2,) thứ nguyên.Numpy Vector (N, 1) dimension -> (N,) dimension conversion

A=np.array([[1,2],[3,4]]) 

x=np.array([1,2]) 

y=np.dot(A,x) 

y.shape 
Out[6]: (2,) 

Nhưng sau đây sẽ hiển thị y2 là (2,1) thứ nguyên.

x2=x[:,np.newaxis] 

y2=np.dot(A,x2) 

y2.shape 
Out[14]: (2, 1) 

Cách hiệu quả nhất để chuyển đổi y2 trở lại y mà không cần sao chép là gì?

Cảm ơn, Tom

Trả lời

16

reshape công trình cho

a = np.arange(3)  # a.shape = (3,) 
b = a.reshape((3,1)) # b.shape = (3,1) 
b2 = a.reshape((-1,1)) # b2.shape = (3,1) 
c = b.reshape((3,))  # c.shape = (3,) 
c2 = b.reshape((-1,)) # c2.shape = (3,) 

ghi chú này cũng là reshape không sao chép dữ liệu trừ khi nó cần phải cho các hình dạng mới (mà nó không cần phải làm ở đây):

a.__array_interface__['data'] # (22356720, False) 
b.__array_interface__['data'] # (22356720, False) 
c.__array_interface__['data'] # (22356720, False) 
1

Slice dọc theo chiều hướng mà bạn muốn, như trong ví dụ dưới đây. Để đi theo hướng ngược lại, bạn có thể sử dụng None làm lát cho bất kỳ tham số nào được coi là thứ nguyên đơn lẻ, nhưng cần thiết để làm cho hình dạng hoạt động.

In [786]: yy = np.asarray([[11],[7]]) 

In [787]: yy 
Out[787]: 
array([[11], 
     [7]]) 

In [788]: yy.shape 
Out[788]: (2, 1) 

In [789]: yy[:,0] 
Out[789]: array([11, 7]) 

In [790]: yy[:,0].shape 
Out[790]: (2,) 

In [791]: y1 = yy[:,0] 

In [792]: y1.shape 
Out[792]: (2,) 

In [793]: y1[:,None] 
Out[793]: 
array([[11], 
     [7]]) 

In [794]: y1[:,None].shape 
Out[794]: (2, 1) 

Ngoài ra, bạn có thể sử dụng reshape:

In [795]: yy.reshape((2,)) 
Out[795]: array([11, 7]) 
0

bản dịch ngược lại có thể được thực hiện bởi:

np.atleast_2d(y).T 
4

Sử dụng numpy.squeeze:

>>> x = np.array([[[0], [1], [2]]]) 
>>> x.shape 
(1, 3, 1) 
>>> np.squeeze(x).shape 
(3,) 
>>> np.squeeze(x, axis=(2,)).shape 
(1, 3) 
+1

Có vẻ như ai đó đã qua và downvoted câu trả lời không chấp nhận mà không để lại bất kỳ ý kiến. Có lẽ là một con troll. – ely