我正在寻找一种很好的方法来“清理”我想通过广播结合在一起的两个数组的维数。特别是我想广播一维数组,直到多维数组的形状,然后然后添加两个数组。我对广播规则的理解告诉我,应该找到多维数组的 last 维是否与一维数组的维匹配。例如,形状为(,3)和(10,3)的数组会很好
我的问题是,考虑到我如何构建阵列,匹配维度恰好是阵列的 first 维度,因此不符合广播规则。作为参考,我的一维数组的形状为(,3),多维数组的形状为(3,10,10,50)。
我可以通过重塑多维数组以使兼容维成为最后一个维来纠正此问题,但是我想避免这种情况,因为当发现不同维具有特定含义时,我发现重塑棘手的逻辑。
我还可以像下面的代码一样向一维数组添加空维度,直到一维数组的维度与下面的代码片段中的高维数组一样多。
>>> import numpy as np
>>> a = np.array([[1,2],
>>> [3,4],
>>> [5,6]])
>>> b = np.array([10,20,30])
>>> a+b[:,None]
array([[11, 12],
[23, 24],
[35, 36]])
这给了我想要的输出,但是在我的情况下,我的高维数组有4个不同的轴,因此我需要添加多个空的维,这开始让人觉得不雅。我可以做类似的事情
b = b[[slice(None)] + 3*[np.newaxis]]
,然后继续,但这似乎并不好。更一般地说,可以想象在原始一维的两侧需要任意数量的新轴,并编写一个辅助函数来概括以上逻辑。有没有更好/更清晰的方法来实现这一目标?