我是一个天真的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]]
在这种情况下,应替换x
(x[:,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]])
答案 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]])