Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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:在多个数组上建立奇妙的索引_Python_Numpy_Vectorization_Scientific Computing - Fatal编程技术网

Python Numpy:在多个数组上建立奇妙的索引

Python Numpy:在多个数组上建立奇妙的索引,python,numpy,vectorization,scientific-computing,Python,Numpy,Vectorization,Scientific Computing,有没有一种有效的方法可以对多个数组进行索引 例如,我有一个要从中索引的数组 a = [[1,2,3],[4,5,6]] 另一个数组包含索引。 b=[[0,1],[1,2]] 我期望[[1,2],[5,6]],它通过[0,1]索引a的第一行,通过[1,2]索引a的第二行 谢谢。如果a和b的长度相同,可能您可以尝试使用np。请按以下说明使用: import numpy as np a = [[1,2,3],[4,5,6]] b = [[0, 1], [1,2]] result = [np.tak

有没有一种有效的方法可以对多个数组进行索引

例如,我有一个要从中索引的数组

a = [[1,2,3],[4,5,6]]
另一个数组包含索引。
b=[[0,1],[1,2]]

我期望
[[1,2],[5,6]]
,它通过
[0,1]
索引
a
的第一行,通过
[1,2]
索引
a
的第二行


谢谢。

如果
a
b
的长度相同,可能您可以尝试使用
np。请按以下说明使用

import numpy as np

a = [[1,2,3],[4,5,6]]
b = [[0, 1], [1,2]]
result = [np.take(a[i],b[i]).tolist() for i in range(len(a))]

print(result)
# result: [[1, 2], [5, 6]]
a
b
是列表。合适的解决方案是嵌套列表理解

In [111]: [[a[i][j] for j in x] for i,x in enumerate(b)]
Out[111]: [[1, 2], [5, 6]]
现在,如果将
a
制作成一个numpy数组:

In [112]: np.array(a)[np.arange(2)[:,None], b]
Out[112]: 
array([[1, 2],
       [5, 6]])
为此,数组的第一维用(2,1)数组索引,第二维用(2,2)数组索引。它们一起广播以产生(2,2)结果

在同一方向工作,但接受的答案使用
ix

Y[np.ix_([0,3],[0,3])]
在(2,2)
b
的情况下,这将不起作用

In [113]: np.array(a)[np.ix_(np.arange(2), b)]
ValueError: Cross index must be 1 dimensional
ix
将第一维度
np.arange(2)
向右旋转(2,1)


这可能会使广播更加明确:

In [114]: np.array(a)[[[0,0],[1,1]], [[0,1],[1,2]]]
Out[114]: 
array([[1, 2],
       [5, 6]])
它选择元素(0,0)、(0,1)、(1,1)和(1,2)


要进一步测试这一点,请使
b
非对称:

In [138]: b = [[0, 1,1], [1,2,0]]       # (2,3)
In [139]: np.array(a)[np.arange(2)[:,None], b]
Out[139]: 
array([[1, 2, 2],
       [5, 6, 4]])
我不认为这是一个很好的重复引用这个问题。
In [138]: b = [[0, 1,1], [1,2,0]]       # (2,3)
In [139]: np.array(a)[np.arange(2)[:,None], b]
Out[139]: 
array([[1, 2, 2],
       [5, 6, 4]])