给定三个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,但y和z均为功能M x 1载体,由于M x 0载体不包含任何元素.
约定是广播将在数组形状的开头插入单一维度。这使得在数组的最后一个维度上执行操作变得很方便,所以(x.T - z).T应该可以工作。
如果要自动决定 的哪个轴与x匹配z,则当且仅当 之类的操作x - z才会导致错误N == M,从而使代码更难测试。因此,该约定提供了一些便利,同时对某些错误具有鲁棒性。
如果您不喜欢z[:, None]简写,也许您会发现z[:, np.newaxis]更清晰。
x[:,0] = y对于像工作这样的作业,您可以使用x[:,0:1] = y。
| 归档时间: |
|
| 查看次数: |
1895 次 |
| 最近记录: |