Numpy广播切片阵列和向量

hbr*_*tow 9 python numpy

给定三个numpy数组:一个多维数组x,一个y具有尾随单一维度的向量,以及一个z不带尾随单一维度的向量,

x = np.zeros((M,N))
y = np.zeros((M,1))
z = np.zeros((M,))
Run Code Online (Sandbox Code Playgroud)

广播操作的行为根据矢量表示和上下文而变化:

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)
Run Code Online (Sandbox Code Playgroud)

我意识到我可以做到以下几点:

x - z[:,None]   # OK
Run Code Online (Sandbox Code Playgroud)

但我不明白这个明确的符号是什么给我买的.它当然不会购买可读性.我不明白为什么表达式没问题x - y,但是x - z含糊不清.

Numpy为什么处理带或不带尾随单一维度的向量?

编辑:该文档指出:两个维度是兼容当它们相等时,或它们中的一个是1,但yz均为功能M x 1载体,由于M x 0载体不包含任何元素.

joe*_*eln 4

约定是广播将在数组形状的开头插入单一维度。这使得在数组的最后一个维度上执行操作变得很方便,所以(x.T - z).T应该可以工作。

如果要自动决定 的哪个轴与x匹配z,则当且仅当 之类的操作x - z才会导致错误N == M,从而使代码更难测试。因此,该约定提供了一些便利,同时对某些错误具有鲁棒性。

如果您不喜欢z[:, None]简写,也许您会发现z[:, np.newaxis]更清晰。

x[:,0] = y对于像工作这样的作业,您可以使用x[:,0:1] = y