2016-03-27 12 views
5

Quan sát:Tại sao numpy.broadcast "transpose" kết quả của vstack và các chức năng tương tự?

In [1]: import numpy as np 
In [2]: x = np.array([1, 2, 3]) 
In [3]: np.vstack([x, x]) 
Out[3]: 
array([[1, 2, 3], 
     [1, 2, 3]]) 

In [4]: np.vstack(np.broadcast(x, x)) 
Out[4]: 
array([[1, 1], 
     [2, 2], 
     [3, 3]]) 

Tương tự như vậy cho column_stackrow_stack (hstack cư xử khác nhau trong trường hợp này nhưng nó cũng khác với khi sử dụng với phát sóng). Tại sao?

Tôi theo logic đằng sau điều đó thay vì tìm cách "sửa chữa" hành vi này (tôi chỉ tốt với nó, nó chỉ là không trực quan).

Trả lời

5

np.broadcast trả về phiên bản của đối tượng trình lặp mô tả cách các mảng sẽ được phát cùng nhau. Trong số những thứ khác, nó mô tả hình dạng và số thứ nguyên mà mảng kết quả sẽ có.

Quan trọng hơn, khi bạn thực sự lặp trên đối tượng này bằng Python bạn nhận được trở lại các bộ của các yếu tố từ mỗi mảng đầu vào:

>>> b = np.broadcast(x, x) 
>>> b.shape 
(3,) 
>>> b.ndim 
1 
>>> list(b) 
[(1, 1), (2, 2), (3, 3)] 

này cho chúng ta biết rằng nếu chúng tôi đã thực hiện một hoạt động thực tế trên các mảng (giả sử, x+x) NumPy sẽ trả về một mảng có hình dạng (3,), một thứ nguyên và kết hợp các phần tử trong bộ để tạo các giá trị trong mảng cuối cùng (ví dụ: nó sẽ thực hiện 1+1, 2+2, 3+3 để bổ sung).

Nếu bạn đào vào nguồn vstack bạn thấy rằng all it does là đảm bảo các yếu tố của iterable rằng nó đã được trao ít nhất hai chiều, và sau đó ngăn xếp chúng dọc theo trục 0.

Trong trường hợp của b = np.broadcast(x, x) này có nghĩa là chúng tôi nhận được các mảng sau đây để ngăn xếp:

>>> [np.atleast_2d(_m) for _m in b] 
[array([[1, 1]]), array([[2, 2]]), array([[3, 3]])] 

ba mảng nhỏ này sau đó được xếp chồng lên nhau theo chiều dọc sản xuất đầu ra bạn lưu ý.


Chính xác như thế nào mảng có kích thước khác nhau được lặp qua song song nằm ở trung tâm của cách thức hoạt động phát sóng NumPy của. Mã này có thể được tìm thấy chủ yếu ở iterators.c. Một tổng quan thú vị về trình lặp vòng đa chiều của NumPy, được viết bởi Travis Oliphant, có thể được tìm thấy trong cuốn sách Beautiful Code.

+0

Điều thú vị là 'np.concatenate (np.broadcast (...))' không hoạt động. Danh sách hiểu rằng 'vstack' (và họ hàng) là cần thiết. 'np.array (danh sách (np.broadcast (...)))' làm việc và nhanh hơn. – hpaulj

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