如何查看numpy广播对象?

3 投票
3 回答
1008 浏览
提问于 2025-04-17 21:27

根据文档的说明:

>>> a = np.array([1.0, 2.0, 3.0])
>>> b = np.array([2.0, 2.0, 2.0])
>>> a * b
array([ 2.,  4.,  6.])

很不错,这样说得通。数组中对齐的元素会被相乘。

然后我注意到还有另一种使用广播的方法;就是用关键词np.broadcast(a,b)。
文档中提到,通过输入np.broadcast(a,b)可以创建一个广播对象。但是,它并没有明确说明如何查看这个对象一旦创建出来后的样子。

文档给了一个例子,但没有详细解释这个例子到底在做什么:

>>> out = np.empty(b.shape)
>>> out.flat = [u+v for (u,v) in b]
>>> out
array([[ 5.,  6.,  7.],
       [ 6.,  7.,  8.],
       [ 7.,  8.,  9.]])

3 个回答

1

使用你的第一个数组进行的 broadcast 是:

In [350]: a = np.array([1,2,3]); b=np.array([2,2,2])
In [351]: ab=list(np.broadcast(a,b))
# [(1, 2), (2, 2), (3, 2)]
In [353]: list([i*j for i,j in ab])
Out[353]: [2, 4, 6]

当数组的维度不同的时候,'broadcasting' 就变得更有趣了,就像你第二个例子中展示的(列向量和行向量)。

这个 broadcast 的例子并不是为了在实际生产中使用。它只是用来说明当你做类似 a*b 这样的操作时,背后发生了什么。

4

你可以通过把一个 numpy.broadcast 对象转换成列表来查看它的内容。

>>> import numpy as np
>>> x = np.array([[1], [2], [3]])
>>> y = np.array([4, 5, 6])
>>> b = np.broadcast(x, y)
>>> b
<numpy.broadcast object at 0xad0310>
>>> list(b)
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
5

另一个选择是使用 np.broadcast_arrays 来查看 xy 在被调整到相同形状后是什么样子的:

In [32]: x = np.array([[1], [2], [3]])    
In [33]: y = np.array([4, 5, 6])

In [37]: x, y = np.broadcast_arrays(x, y)

In [38]: x
Out[38]: 
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

In [39]: y
Out[39]: 
array([[4, 5, 6],
       [4, 5, 6],
       [4, 5, 6]])

In [40]: x+y
Out[40]: 
array([[5, 6, 7],
       [6, 7, 8],
       [7, 8, 9]])

撰写回答