Python Numpy:按另一个数组合并数组列表(np.choose alternative)
我有一个numpy数组列表,每个数组的形状都相同。比如说:Python Numpy:按另一个数组合并数组列表(np.choose alternative),python,arrays,numpy,indexing,take,Python,Arrays,Numpy,Indexing,Take,我有一个numpy数组列表,每个数组的形状都相同。比如说: a = [np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), np.array([[11, 12, 13], [14, 15, 16], [17, 18, 19]]), np.array([[99, 98, 97], [96, 95
a = [np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]),
np.array([[11, 12, 13],
[14, 15, 16],
[17, 18, 19]]),
np.array([[99, 98, 97],
[96, 95, 94],
[93, 92, 91]])]
我还有另一个相同形状的数组,它给出了我想要从中获取元素的列表索引:
b = np.array([[0, 0, 1],
[2, 1, 0],
[2, 1, 2]])
我想得到的是:
np.array([[1, 2, 13],
[96, 15, 6],
[93, 18, 91]])
有一个简单的解决方案效果很好:
np.choose(b, a)
但这最多限于32个阵列。但在我的例子中,我必须组合更多的数组(超过100个)。所以我需要另一种方法来做到这一点
我想,它一定是关于高级索引的,或者可能是np.take
方法。因此,第一步可能是a=np.array(a)
,然后是类似a[np.arange(a.shape[0]),b]
。但我没有让它工作
有人能帮忙吗?:) 您可以尝试使用。根据答案。当然,您必须首先将a
转换为NumPy数组
i, j = np.ogrid[0:3, 0:3]
print (a[b, i, j])
# array([[ 1, 2, 13],
# [96, 15, 6],
# [93, 18, 91]])
您希望使用b
索引第一个维度。对于其他维度,您需要使用b
广播的索引,即列向量和行向量:
In [133]: A[b, np.arange(3)[:,None], np.arange(3)]
Out[133]:
array([[ 1, 2, 13],
[96, 15, 6],
[93, 18, 91]])
创建这些阵列有各种方便的功能,例如
In [134]: np.ix_(range(3),range(3))
Out[134]:
(array([[0],
[1],
[2]]), array([[0, 1, 2]]))
和另一个答案中提到的ogrid
这里有一个相对较新的功能也可以完成这项工作:
In [138]: np.take_along_axis(A, b[None,:,:], axis=0)
Out[138]:
array([[[ 1, 2, 13],
[96, 15, 6],
[93, 18, 91]]])
在调整到
b
正确之前,我必须想一想。我也必须想很多。为了尝试和理解这些答案:D新函数np.take_沿轴
对我有利,因为它看起来是最可读的函数。
In [138]: np.take_along_axis(A, b[None,:,:], axis=0)
Out[138]:
array([[[ 1, 2, 13],
[96, 15, 6],
[93, 18, 91]]])