【问题标题】:How to conditionally combine two numpy arrays of the same shape如何有条件地组合两个相同形状的numpy数组
【发布时间】:2020-10-02 19:04:43
【问题描述】:

这听起来很简单,但我想我想得太复杂了。

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

说明:

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 元素值中的较大者的数组。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    我们可以使用 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
    

    扩展到其他支持的 ufuncs

    同样,np.minimum 用于在两个具有相同或可广播形状的数组之间查找元素最小值。所以,要找到array1array2 之间的元素最小值,我们需要:

    np.minimum(array1, array2)
    

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

    加、减、乘、除、logaddexp、logaddexp2、true_divide、 floor_divide, 电源, 余数, mod, fmod, divmod, heaviside, gcd, lcm,arctan2,hypot,bitwise_and,bitwise_or,bitwise_xor,left_shift, 右移,更大,更大,等于,更少,更少,等于,不等于, 等于,logical_and,logical_or,logical_xor,最大值,最小值,fmax, fmin、copysign、nextafter、ldexp、fmod

    【讨论】:

    • 啊哈。感谢timeit,但很明显,标准的、优化的 numpy 方式比自定义方式更快。我的方法只有在更复杂的条件下才有意义。
    • @EricDuminil 是的!只是想看看各种方法是如何叠加起来的,对我自己和其他人也是如此。
    【解决方案2】:

    如果您的情况变得更加复杂,您可以使用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])
    

    【讨论】:

      猜你喜欢
      • 2020-04-04
      • 2014-02-15
      • 2019-07-30
      • 2021-06-16
      • 2021-05-28
      • 1970-01-01
      • 2014-11-12
      • 2016-02-14
      相关资源
      最近更新 更多