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

时间:2018-08-07 00:25:08

标签: python arrays python-3.x numpy lambda

说我有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 个答案:

答案 0 :(得分:2)

就这么简单:

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

这将为您提供一个数组,其中0表示a1表示b,依此类推。 如果您真的很在意,则可以将地图dict(zip(range(4),'abcd'))应用于它。

对于“更笼统的”问题,您正在研究numpy.vectorize

答案 1 :(得分:0)

主要问题:如果使用np.concatenate将数组堆叠在一起,则可以使用np.argmax获取一个数组,该数组显示哪个数组在每个位置上具有最大的元素。下例显示了一维阵列的情况。您需要axis=2用于2D阵列。

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])

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