Python 如何用一个函数将多个numpy数组快速映射到不同对象的单个数组
假设我有4个numpy阵列,如:Python 如何用一个函数将多个numpy数组快速映射到不同对象的单个数组,python,arrays,python-3.x,numpy,lambda,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,
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函数在这里似乎不起作用。我知道一个循环可以工作,但是有一个批处理函数可以做到这一点吗
更一般地说,问题是,在不使用循环的情况下,如何将单个函数应用于数组中的每个数组元素
谢谢 就这么简单:
np.argmax((a,b,c,d),axis=0)
这将为您提供一个数组,其中0
表示a
,1
表示b
,依此类推。
如果您真的在意,那么您可以将mapdict(zip(范围(4),'abcd'))
应用到它
对于“更一般”的问题,您将看到如下简单的numpy.vectorize
:
np.argmax((a,b,c,d),axis=0)
这将为您提供一个数组,其中0
表示a
,1
表示b
,依此类推。
如果您真的在意,那么您可以将mapdict(zip(范围(4),'abcd'))
应用到它
对于“更一般”的问题,您要看的是
numpy.vectorize
对于您的主要问题:如果您使用np.concatenate
将数组堆叠在一起,那么您可以使用np.argmax
获得一个数组,该数组显示每个位置上哪个数组的元素最大。下面的示例显示了1D阵列的这一点。对于二维阵列,您需要轴=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])
您的另一个问题“如何在不使用循环的情况下将单个函数应用于阵列中的每个阵列元素?”还不清楚。我不明白这是什么意思,但它可能应该是一个单独的问题。对于你的主要问题:如果你使用
np.concatenate
将数组堆叠在一起,那么你可以使用np.argmax
得到一个数组,显示哪个数组在每个位置具有最大的元素。下面的示例显示了1D阵列的这一点。对于二维阵列,您需要轴=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])
您的另一个问题“如何在不使用循环的情况下将单个函数应用于阵列中的每个阵列元素?”还不清楚。我不明白它是什么意思,但它可能是一个单独的问题。
np.array(['a','b','c','d'])[np.argmax((a,b,c,d),axis=0)]
将返回OP所寻找的矩阵+1np.array(['a','b','c','d'])[np.argmax((a,b,c,d),axis=0)]
将返回OP所寻找的矩阵+什么是“lambda函数”?什么是“lambda函数”?