numpy多维数组的条件运算

时间:2012-07-13 11:03:29

标签: python multidimensional-array numpy

我是一个天真的numpy用户,需要你的帮助解决以下问题:我想用第三个数组替换多维数组的一些元素,这些元素少于第二个数组; e.g:

x = np.arange(16).reshape((2, 8)) 
# x = np.array([[ 0,  1,  2,  3,  4,  5,  6,  7],
#               [ 8,  9, 10, 11, 12, 13, 14, 15]])

y = np.array([[2], [13]])
# y = np.array([[ 2], [13]])

现在,找出x大于y的位置,如果True数组中至少有一个x > y,请计算这些实例,创建另一个数组( z}并将这些元素中的x替换为z

x > y 
# = [[False, False, False, True,  True,  True,  True, True],
#    [False, False, False, False, False, False, True, True]]

在这种情况下,应替换xx[:,3:])的5个元素,因此我们创建了一个(5, 2)数组:

z = np.array([[20,21],[22,23],[24,25],[26,27],[28,29]])

我想要的结果是

x == np.array([[ 0,  1,  2, 20, 22, 24, 26, 28],
               [ 8,  9, 10, 21, 23, 25, 27, 29]])

1 个答案:

答案 0 :(得分:4)

一个numpy函数几乎你想要的是numpy.where

x = np.arange(16).reshape((2, 8))
y = np.array([[2], [13]])
z = np.arange(16, 32).reshape((2, 8))
numpy.where(~(x > y).any(axis=0), x, z)

结果:

array([[ 0,  1,  2, 19, 20, 21, 22, 23],
       [ 8,  9, 10, 27, 28, 29, 30, 31]])

这与您要求的唯一区别是z必须可以播放到与x相同的形状。除非您绝对需要使用z值,其中的列数与True中的~(x > y).any(axis=0)值一样多,否则我认为这是最佳方法。< / p>

但是,鉴于您的意见,您似乎确实需要使用上述z值。听起来这个函数可以保证形状匹配,所以你可以这样做:

x[:,(x > y).any(axis=0)] = z.T

测试:

>>> z = np.arange(20, 30).reshape((5, 2))
>>> x[:,(x > y).any(axis=0)] = z.T
>>> x
array([[ 0,  1,  2, 20, 22, 24, 26, 28],
       [ 8,  9, 10, 21, 23, 25, 27, 29]])