说我有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函数似乎在这里不起作用。我知道循环会起作用,但是有一个批处理功能可以做到这一点吗?
更笼统地说,问题是,如何在不使用循环的情况下将各个函数应用于整个数组中的每个数组元素?
谢谢!
答案 0 :(得分:2)
就这么简单:
np.argmax((a,b,c,d),axis=0)
这将为您提供一个数组,其中0
表示a
,1
表示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])
您的另一个问题“如何在不使用循环的情况下将各个函数应用于整个数组中的每个数组元素?”尚不清楚。我不明白这是什么意思,但这可能应该是一个单独的问题。