python - python - 在具有相同“外部”大小的数组之间广播
问题描述
Numpy 似乎对广播数组有一些(对我来说)不直观的行为。假设我们有两个数组
a = numpy.ones((2,2,3))
b = numpy.array([[1],[2]])
我希望能够将这些相乘,输出为
>>> a*b
array([[[1., 1., 1.],
[1., 1., 1.]],
[[2., 2., 2.],
[2., 2., 2.]]])
然而相反,我们得到
>>> a*b
array([[[1., 1., 1.],
[2., 2., 2.]],
[[1., 1., 1.],
[2., 2., 2.]]])
实际上,这种乘法之所以有效,是因为 的第二个维度与(2,在这种情况下)的外部维度a
相同。相反,如果我们有,我会收到以下错误:b
a = numpy.ones((2,3,3))
>>> a*b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3,3) (2,1)
我觉得这很奇怪的原因是,将具有形状 (3,4) 和 (1,) 的数组一起广播可以正常工作 - 那么为什么当它们是两个较大数组的“子数组”时它不工作呢?
做我想做的最“pythonic”的方式是什么?具体来说,这是为了创建一个 3D ndarray,其中每个 2D 子阵列都具有贯穿始终重复的不同值。显然我可以只使用一个循环,但它似乎并不优雅。
解决方案
你有一个(2,2,3)和一个(2,1)。第二个扩展为(1,2,1)(前面的自动新轴),然后扩展为(2,2,3)。
尝试b[:,:,None]
制作它(2,1,1)。
推荐阅读
- intellij-idea - 如何在评论后阻止 CLion 双重缩进?
- java - 如何在按钮上方制作视图(最小 SDK:17)
- javascript - DOM 事件 API JavaScript
- c++ - 如何在 CImg 中将像素数据作为矩阵/向量获取?
- mysql - 下面的mysql查询有什么问题
- r - 如果满足另一行的条件,则删除组内的行
- java - spring security 没有调用 loadUserByUsername() 方法
- scala - UDF Scala 火花语法
- python - 下载文件时的Python多处理比正常实现慢
- c++ - 修改 std::valarray 的元素是否安全
同时?