如何有条件地组合两个相同形状的numpy阵列

时间:2017-10-04 06:14:06

标签: python arrays numpy

这听起来很简单,我想我在脑海里过于复杂。

我想创建一个数组,其元素是从两个相同形状的源数组生成的,具体取决于源数组中的哪个元素更大。

说明:

import numpy as np
array1 = np.array((2,3,0))
array2 = np.array((1,5,0))

array3 = (insert magic)
>> array([2, 5, 0))

我无法弄清楚如何生成一个array3,它结合了array1和array2的元素来生成一个数组,其中只取两个array1 / array2元素值中较大的一个。

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:19)

我们可以使用NumPy内置np.maximum,完全是出于此目的 -

np.maximum(array1, array2)

另一种方法是在2D堆叠阵列上使用NumPy ufunc np.max,在第一轴max-reduce上使用(axis=0) -

np.max([array1,array2],axis=0)

关于100万个数据集的计时 -

In [271]: array1 = np.random.randint(0,9,(1000000))

In [272]: array2 = np.random.randint(0,9,(1000000))

In [274]: %timeit np.maximum(array1, array2)
1000 loops, best of 3: 1.25 ms per loop

In [275]: %timeit np.max([array1, array2],axis=0)
100 loops, best of 3: 3.31 ms per loop

# @Eric Duminil's soln1
In [276]: %timeit np.where( array1 > array2, array1, array2)
100 loops, best of 3: 5.15 ms per loop

# @Eric Duminil's soln2
In [277]: magic = lambda x,y : np.where(x > y , x, y)

In [278]: %timeit magic(array1, array2)
100 loops, best of 3: 5.13 ms per loop

扩展到其他支持的ufunc

类似地,有np.minimum用于在两个相同或可广播形状的数组之间找到元素最小值。因此,要在array1array2之间找到元素最小值,我们可以:

np.minimum(array1, array2)

有关支持此功能的ufuncs的完整列表,请参阅docs并查找关键字:element-wiseGrep - 为了那些,我得到了以下ufuncs:

  

add,subtract,multiply,divide,logaddexp,logaddexp2,true_divide,   floor_divide,power,remainder,mod,fmod,divmod,heavyiside,gcd,   lcm,arctan2,hypot,bitwise_and,bitwise_or,bitwise_xor,left_shift,   right_shift,greater,greater_equal,less,less_equal,not_equal,   equal,logical_and,logical_or,logical_xor,maximum,minimum,fmax,   fmin,copysign,nextafter,ldexp,fmod

答案 1 :(得分:12)

如果您的病情变得更加复杂,您可以使用np.where

import numpy as np
array1 = np.array((2,3,0))
array2 = np.array((1,5,0))
array3 = np.where( array1 > array2, array1, array2)
# array([2, 5, 0])

您可以用任何条件替换array1 > array2。如果您想要的只是最大值,请使用@Divakar的answer

只是为了好玩:

magic = lambda x,y : np.where(x > y , x, y)
magic(array1, array2)
# array([2, 5, 0])
相关问题