5

我是一个天真的 numpy 用户,需要您帮助解决以下问题:我想用第三个数组替换小于第二个数组的多维数组的一些元素;例如:

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,如果数组中至少有一个Truex > y计算这些实例,创建另一个数组 ( z) 并将x这些元素替换为z

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

x在这种情况下( )的 5 个元素x[:,3:]应该被替换,所以我们创建一个(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]])
4

1 回答 1

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)我认为这是最好的方法。

但是,鉴于您的评论,您似乎确实需要使用上述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]])
于 2012-07-13T11:15:03.347 回答