代码之家  ›  专栏  ›  技术社区  ›  Rocky Li

如何快速将一个函数的多个numpy数组映射到不同对象的单个数组

  •  0
  • Rocky Li  · 技术社区  · 7 年前

    假设我有4个numpy数组,比如:

    a : np.random.randn(4,4)
    

    就像

    array([[ 0.8087178 , -1.32970726, -0.62254544,  0.82266235],
       [-0.57101685, -1.39512136, -0.19650182,  0.46574661],
       [-1.06096896,  0.92744505,  1.98807088,  1.11976449],
       [-0.0103123 ,  1.49460442, -0.16151632,  0.96951708]])
    

    那我有了 b, c, d 同样相等 np.random.randn(4,4)

    现在,假设我想知道字符串中每个数组位置的最大值,如下所示:

     array([[a, b, d, c],
            [b, c, a, a],
            [c, a, b, b],
            [d, c, a, b]])
    

    我该怎么做?lambda函数在这里似乎不起作用。我知道一个循环可以工作,但是是否有一个批处理函数可以做到这一点?

    一般来说,问题是,如何在不使用循环的情况下对数组中的每个数组元素应用单独的函数?

    谢谢!

    2 回复  |  直到 7 年前
        1
  •  2
  •   Julien    7 年前

    如此简单:

    np.argmax((a,b,c,d),axis=0)
    

    这会给你一个数组 0 方法 a , 1 方法 b ,等等。 如果你真的在乎,你可以把地图 dict(zip(range(4),'abcd')) 为了它。

    对于“更一般”的问题,你要看 numpy.vectorize .

        2
  •  0
  •   Oscar Benjamin    7 年前

    对于您的主要问题:如果使用 np.concatenate 那你就可以用 np.argmax 获取一个数组,该数组显示在每个位置哪个数组的元素最大。下面的示例显示了1D数组的这种情况。你会想要的 axis=2 对于二维阵列。

    In [1]: import numpy as np
    
    In [2]: a1 = np.array([1, 2, 3, 4])
    
    In [3]: a2 = np.array([3, 2, 1, 1])
    
    In [4]: a1
    Out[4]: array([1, 2, 3, 4])
    
    In [5]: a2
    Out[5]: array([3, 2, 1, 1])
    
    In [6]: np.concatenate([a1, a2])
    Out[6]: array([1, 2, 3, 4, 3, 2, 1, 1])
    
    In [7]: np.concatenate([[a1], [a2]])
    Out[7]: 
    array([[1, 2, 3, 4],
           [3, 2, 1, 1]])
    
    In [9]: ai = np.concatenate([[a1], [a2]])
    
    In [11]: np.argmax(ai, axis=1)
    Out[11]: array([3, 0])
    
    In [12]: np.argmax(ai, axis=0)
    Out[12]: array([1, 0, 0, 0])
    

    您的另一个问题是“如何在不使用循环的情况下跨数组对每个数组元素应用单独的函数?”不清楚。我不明白这是什么意思,但可能是另外一个问题。