广播数组的最小值/最大值

问题描述 投票:0回答:1

是否有一种方法可以有效地比较一起广播的多个阵列?例如:

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,其中ijklmn分别索引各个数组。我想要得到的是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))。

python numpy numpy-broadcasting
1个回答
1
投票

您可以通过对ab进行操作来存储中间数组(无论如何都比最终结果要小:

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)
© www.soinside.com 2019 - 2024. All rights reserved.