Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy:按另一个数组合并数组列表(np.choose alternative)_Python_Arrays_Numpy_Indexing_Take - Fatal编程技术网

Python Numpy:按另一个数组合并数组列表(np.choose alternative)

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

我有一个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, 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]]])