给定三个numpy数组:一个多维数组x
,一个带有尾随单例维度的向量y
,一个没有尾随单例维度的向量z
。
x = np.zeros((M,N))
y = np.zeros((M,1))
z = np.zeros((M,))
广播操作的行为取决于向量表示和上下文:
x[:,0] = y # error cannot broadcast from shape (M,1) into shape (M)
x[:,0] = z # OK
x[:,0] += y # error non-broadcastable output with shape (M) doesn't match
# broadcast shape(M,M)
x[:,0] += z # OK
x - y # OK
x - z # error cannot broadcast from shape (M,N) into shape (M)
我意识到我可以做以下事情:
x - z[:,None] # OK
但我不明白这种显式表示法有什么用处。它并没有提高可读性。我不明白为什么表达式
x - y
是可以的,但 x - z
却是模棱两可的。为什么Numpy对带或不带尾随单例维度的向量进行不同处理?
编辑:文档 指出:当两个维度相等或其中一个维度为1时,它们是兼容的,但是
y
和 z
都是功能上的 M x 1
向量,因为一个 M x 0
向量不包含任何元素。
x[:,0]
是1维的。x[:,[0]]
是 (M,1) 的。z[:]=y
可能会产生相同的错误。 - hpauljz
可以在不复制的情况下被重塑为 (M,1) 或 (1,M)。但从功能上讲,它更接近于 (1,M),因为会自动在开头进行扩展。 - hpaulj