Numpy 似乎對廣播數組有一些(對我而言)不直觀的行為。假設我們有兩個數組a = numpy.ones((2,2,3))b = numpy.array([[1],[2]])我希望能夠將這些相乘,輸出為>>> a*barray([[[1., 1., 1.], [1., 1., 1.]], [[2., 2., 2.], [2., 2., 2.]]])然而,我們得到>>> a*barray([[[1., 1., 1.], [2., 2., 2.]], [[1., 1., 1.], [2., 2., 2.]]])事實上,這種乘法僅僅工作,因為該第二的尺寸a是相同的外尺寸b(圖2,在這種情況下)。如果我們有a = numpy.ones((2,3,3)),我會收到以下錯誤:>>> a*bTraceback (most recent call last): File "<stdin>", line 1, in <module>ValueError: operands could not be broadcast together with shapes (2,3,3) (2,1)我覺得這很奇怪的原因是,將具有形狀 (3,4) 和 (1,) 的數組一起廣播會很好地工作 - 那么為什么當它們是兩個較大數組的“子數組”時它不起作用?什么是最“pythonic”的方式來做我想做的事?具體來說,這是為了創建一個 3D ndarray,其中每個 2D 子數組都具有重復的不同值。顯然我可以只使用循環,但它看起來并不優雅。
2 回答

紅糖糍粑
TA貢獻1815條經驗 獲得超6個贊
怎么樣?
a = np.ones((2,2,3))
b = np.array([[[1],
[1]],
[[2],
[2]]])
print(a*b)
array([[[1., 1., 1.],
[1., 1., 1.]],
[[2., 2., 2.],
[2., 2., 2.]]])
添加回答
舉報
0/150
提交
取消