Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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数组作为另一个数组的第二个dim的索引?_Python_Numpy_Indexing - Fatal编程技术网

Python 使用numpy数组作为另一个数组的第二个dim的索引?

Python 使用numpy数组作为另一个数组的第二个dim的索引?,python,numpy,indexing,Python,Numpy,Indexing,例如,我有两个numpy数组 A = np.array( [[0,1], [2,3], [4,5]]) B = np.array( [[1], [0], [1]], dtype='int') 我想从A的每一行中提取一个元素,该元素由B索引,因此我想要以下结果: C = np.array( [[1], [2], [5]]) 我尝试了A[:,B.ravel()],但它将播放B,而不是我想要的。也研究了np.take,似乎不是解决我问题的正确方法

例如,我有两个numpy数组

A = np.array(
  [[0,1], 
   [2,3], 
   [4,5]])
B = np.array(
  [[1],
   [0],
   [1]], dtype='int')
我想从
A
的每一行中提取一个元素,该元素由
B
索引,因此我想要以下结果:

C = np.array(
  [[1],
   [2],
   [5]])
我尝试了
A[:,B.ravel()]
,但它将播放
B
,而不是我想要的。也研究了np.take,似乎不是解决我问题的正确方法

但是,我可以使用
np。通过转置
A
选择

np.choose(B.ravel(), A.T)
但是还有其他更好的解决方案吗?

您可以使用-

样本运行-

In [57]: A
Out[57]: 
array([[0, 1],
       [2, 3],
       [4, 5]])

In [58]: B
Out[58]: 
array([[1],
       [0],
       [1]])

In [59]: A[np.arange(A.shape[0]),B.ravel()]
Out[59]: array([1, 2, 5])
In [186]: A
Out[186]: 
array([[0, 1],
       [2, 3],
       [4, 5]])

In [187]: B
Out[187]: [1, 0, 1]

In [188]: A[np.arange(A.shape[0]),B]
Out[188]: array([1, 2, 5])
请注意,如果
B
1D
数组或此类列索引的列表,只需使用
.ravel()
跳过展平操作即可

样本运行-

In [57]: A
Out[57]: 
array([[0, 1],
       [2, 3],
       [4, 5]])

In [58]: B
Out[58]: 
array([[1],
       [0],
       [1]])

In [59]: A[np.arange(A.shape[0]),B.ravel()]
Out[59]: array([1, 2, 5])
In [186]: A
Out[186]: 
array([[0, 1],
       [2, 3],
       [4, 5]])

In [187]: B
Out[187]: [1, 0, 1]

In [188]: A[np.arange(A.shape[0]),B]
Out[188]: array([1, 2, 5])
你可以用-

样本运行-

In [57]: A
Out[57]: 
array([[0, 1],
       [2, 3],
       [4, 5]])

In [58]: B
Out[58]: 
array([[1],
       [0],
       [1]])

In [59]: A[np.arange(A.shape[0]),B.ravel()]
Out[59]: array([1, 2, 5])
In [186]: A
Out[186]: 
array([[0, 1],
       [2, 3],
       [4, 5]])

In [187]: B
Out[187]: [1, 0, 1]

In [188]: A[np.arange(A.shape[0]),B]
Out[188]: array([1, 2, 5])
请注意,如果
B
1D
数组或此类列索引的列表,只需使用
.ravel()
跳过展平操作即可

样本运行-

In [57]: A
Out[57]: 
array([[0, 1],
       [2, 3],
       [4, 5]])

In [58]: B
Out[58]: 
array([[1],
       [0],
       [1]])

In [59]: A[np.arange(A.shape[0]),B.ravel()]
Out[59]: array([1, 2, 5])
In [186]: A
Out[186]: 
array([[0, 1],
       [2, 3],
       [4, 5]])

In [187]: B
Out[187]: [1, 0, 1]

In [188]: A[np.arange(A.shape[0]),B]
Out[188]: array([1, 2, 5])

所以根本就没有广播?如果我从问题中得到了正确的预期输出,那么这里就不需要广播了。我们基本上是在每个维度使用整数来选择元素。我们有
B
中的第二个dim索引,因此我们只需要使用
np.arange
为第一个dim创建相应的索引。希望这是有意义的!所以根本就没有广播?如果我从问题中得到了正确的预期输出,那么这里就不需要广播了。我们基本上是在每个维度使用整数来选择元素。我们有
B
中的第二个dim索引,因此我们只需要使用
np.arange
为第一个dim创建相应的索引。希望这是有意义的!可能重复:@unutbu在这里有点不同,因为我们每行选择一个元素,而不是链接的上一个问题中每行选择多个元素。@Divakar:如果OP想要2D数组,
C
,您在链接页面上的答案会给出准确的结果。@unutbu,您链接的答案使用
np.take
,我不认为它能解决我的问题?可能的重复:@unutbu这里有点不同,因为我们在前面的问题中选择了每行一个元素,而不是每行多个元素。@Divakar:如果OP想要2D数组,
C
,你在链接页面上的答案会给出准确的结果。@unutbu,你链接的答案使用了
np.take
,我认为它不能解决我的问题?