簡體   English   中英

為什么numpy.broadcast會“轉置” vstack和類似函數的結果?

[英]Why does numpy.broadcast “transpose” results of vstack and similar functions?

觀察:

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]])

類似地,對於column_stackrow_stackhstack表現不同在這種情況下,但它與廣播一起使用時也不同)。 為什么?

我遵循其背后的邏輯,而不是找到一種“修復”此行為的方法(我對此很好,這很不直觀)。

np.broadcast返回一個迭代器對象的實例,該實例描述應如何一起廣播數組。 1其中,它描述了所得數組將具有的形狀和維數。

至關重要的是,當您實際在Python中迭代此對象時,您會從每個輸入數組中獲取元組的元組:

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

這告訴我們,如果我們在數組上執行實際操作(例如x+x ),則NumPy將返回一個形狀為(3,)的數組,該數組是一個維度,並將元組中的元素組合在一起,以生成最終數組中的值(例如,它將執行1+1 2+2 3+3的加法運算)。

如果深入研究vstack的源,您會發現它所做的全部就是確保已賦予它的iterable的元素至少是二維的,然后沿軸0堆疊它們。

b = np.broadcast(x, x)的情況下,這意味着我們要堆疊以下數組:

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

然后將這三個小陣列垂直堆疊,產生您注意到的輸出。


1 NumPy廣播工作的核心是如何並行並行地迭代變化維數的數組。 該代碼主要在iterators.c中找到。 Travis Oliphant親自撰寫的有關NumPy多維迭代器的有趣概述可以在“ 美麗代碼”書中找到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM