使用2d数组作为指示从2d numpy数组中提取元素

时间:2018-06-08 13:57:30

标签: python arrays numpy

我有一个二维数组:

>>> input = np.array([[1,2],[3,4]])
>>> input
array([[1, 2],
       [3, 4]])

我也有这个数组,其列数与输入数组相同,每行包含从输入数组的匹配列中提取的索引。

>>> indices = np.array([[0],[1]])
>>> indices
array([[0],
       [1]])

在这个例子中,我想得到以下数组作为输出:

array([[1],
       [4]])

我能以任何方式实现这一目标吗?

3 个答案:

答案 0 :(得分:3)

通过NumPy数组索引的一种方法。

        date val1     val2  val3  val4
1 2018-06-07  AAA  26512.0   123   1.0
3 2018-06-07  AAA  26543.0   123   0.0

请注意,我们需要确保行和列索引器具有相同的形状,在本例中为A = np.array([[1,2],[3,4]]) idx = np.array([[0],[1]]) res = A[np.arange(A.shape[0])[:, None], idx] print(res) [[1] [4]] ,其中(n, 1)是行数。

答案 1 :(得分:1)

你可以试试这个:

#!python
# -*- coding: utf-8 -*-#
#
# Imports
import numpy as np

arr = np.array([[1,2],[3,4]])
idx = np.array([[0],[1]])

ans = arr[idx,idx]
print(ans)

这回答了OP的具体问题,但是,如果我们想要更一般的回答,请遵循@jpp的想法,并且这样做:

# Imports
import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
idx = np.array([0, 1, 1])

col_vec1 = np.arange(arr.shape[0])[:, None]
col_vec2 = idx[:, None]

ans = arr[col_vec1, col_vec2]

print(arr[0, 0])  # 1
print(arr[1, 1])  # 5
print(arr[2, 1])  # 8

print(ans)

答案 2 :(得分:0)

您可以先剪切索引:

in_array=np.arange(20).reshape(4,5)
ind=np.array([[0,2],[1,3]])
in_array[ind[:,0],ind[:,1]]
array([2, 8])

也不要使用input这样的名称,因为它们是python的内置函数,你要覆盖它们。