是否有一种方法可以有效地比较一起广播的多个阵列?例如:
a = np.arange( 0, 9).reshape(3,3)
b = np.arange( 9, 18).reshape(3,3)
c = np.arange(18, 27).reshape(3,3)
如果我要广播这些内容,如下:
abc = a[:,:,None,None,None,None] + b[None,None,:,:,None,None] + c[None,None,None,None,:,:]
然后abc
的每个元素等于a_ij + b_kl + c_mn
,其中ij
,kl
和mn
分别索引各个数组。我想要得到的是min(a_ij, b_kl, c_mn)
,或者理想情况下是max(a_ij, b_kl, c_mn) - min(a_ij, b_kl, c_mn)
。有没有一种有效的方法可以做到这一点?
我当然可以将临时数组广播为:
Abc = a[:,:,None,None,None,None] + 0 * b[None,None,:,:,None,None] + 0 * c[None,None,None,None,:,:]
aBc = 0 * a[:,:,None,None,None,None] + b[None,None,:,:,None,None] + 0 * c[None,None,None,None,:,:]
abC = 0 * a[:,:,None,None,None,None] + 0 * b[None,None,:,:,None,None] + c[None,None,None,None,:,:]
,然后从这些数组中找到最小值/最大值,但是,这些数组可能会变得很大。如果有某种方法可以一步完成,那就更好了。
另外,请注意,这些数组可以广播,但不一定具有相同的形状(例如(1, 3)
和(3, 3)
)。
您可以通过对a
和b
进行操作来存储中间数组(无论如何都比最终结果要小:
temp = np.minimum.outer(a.ravel(), b.ravel())
res = np.minimum.outer(temp.ravel(), c.ravel())
,然后用c
重复相同的操作。 minimum
计算2个数组的逐元素最小值。由于它是ufunc
,因此可以使用outer
将该操作应用于这2个数组的所有值对。
您可以根据需要调整res
的形状。
编辑#1
感谢P. Panzer评论,您不需要将一维数组与ufunc.outer
一起使用,这将导致更简单的代码:
temp = np.minimum.outer(a, b)
res = np.minimum.outer(temp, c)