【发布时间】:2014-04-06 21:13:42
【问题描述】:
给定三个 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 会以不同的方式处理带有或不带有尾随单维的向量?
编辑:documentation 声明:两个维度在它们相等或其中之一为 1 时是兼容的,但 y 和 z 在功能上都是 M x 1 向量,因为M x 0 向量不包含任何元素。
【问题讨论】:
-
一个关键点是
x[:,0]是1d。x[:,[0]]是 (M,1)。z[:]=y可能会给出同样的错误。 -
z可以在不复制的情况下重塑为 (M,1) 或 (1,M)。但在功能上它更接近 (1,M),因为开头是自动扩展的。