2012-10-05 41 views
49

Tôi cố gắng để làm như sau nhưng với mảng NumPy:Tương đương với "zip()" trong Python sần?

x = [(0.1, 1.), (0.1, 2.), (0.1, 3.), (0.1, 4.), (0.1, 5.)] 
normal_result = zip(*x) 

Điều này sẽ cho một kết quả của:

normal_result = [(0.1, 0.1, 0.1, 0.1, 0.1), (1., 2., 3., 4., 5.)] 

Nhưng nếu vector đầu vào là một mảng NumPy:

y = np.array(x) 
numpy_result = zip(*y) 
print type(numpy_result) 

Nó (dự kiến) trả về a:

<type 'list'> 

Vấn đề là tôi sẽ cần phải chuyển đổi kết quả trở lại thành một mảng numpy sau này.

Điều tôi muốn biết là điều gì sẽ xảy ra nếu có một chức năng gọn gàng hiệu quả để tránh những biến đổi ngược lại này?

Trả lời

72

Bạn chỉ có thể transpose nó ...

>>> a = np.array([(0.1, 1.), (0.1, 2.), (0.1, 3.), (0.1, 4.), (0.1, 5.)]) 
>>> a 
array([[ 0.1, 1. ], 
     [ 0.1, 2. ], 
     [ 0.1, 3. ], 
     [ 0.1, 4. ], 
     [ 0.1, 5. ]]) 
>>> a.T 
array([[ 0.1, 0.1, 0.1, 0.1, 0.1], 
     [ 1. , 2. , 3. , 4. , 5. ]]) 
31

Hãy thử sử dụng dstack:

>>> from numpy import * 
>>> a = array([[1,2],[3,4]]) # shapes of a and b can only differ in the 3rd dimension (if present) 
>>> b = array([[5,6],[7,8]]) 
>>> dstack((a,b)) # stack arrays along a third axis (depth wise) 
array([[[1, 5], 
     [2, 6]], 
     [[3, 7], 
     [4, 8]]]) 

như vậy trong trường hợp của bạn nó sẽ là:

x = [(0.1, 1.), (0.1, 2.), (0.1, 3.), (0.1, 4.), (0.1, 5.)] 
y = np.array(x) 
np.dstack(y) 

>>> array([[[ 0.1, 0.1, 0.1, 0.1, 0.1], 
    [ 1. , 2. , 3. , 4. , 5. ]]]) 
+2

Thêm thêm một chiều hướng đến mảng 2d. Nếu bạn muốn một cái gì đó tương tự như những gì OP muốn, bạn sẽ phải lấy phần tử đầu tiên của mảng dstacked. – benjwadams

+0

Numpy np.stack là gần nhất để nén cho ma trận. 'mảng = (x, y); np.stack (mảng, trục = len (mảng)) '. – CMCDragonkai

+2

Ngoài ra còn có np.column_stack, có thể là những gì OP cần. – RecencyEffect

Các vấn đề liên quan