如何从矩阵中选择特定的列索引?

时间:2014-12-18 20:44:48

标签: python arrays numpy

我有一个矩阵和一列列索引,我想从矩阵中为每一行选择。我怎么能在numpy中做到这一点?

my_matrix = np.array([[1, 2], [4, 5]])
col_idx = np.array([1, 0])
selected = .... # selects 1st element of row 0 and 0th element of row 1.
print selected
# np.array([2, 4])

3 个答案:

答案 0 :(得分:2)

您可以使用范围进行切片:

In [11]: my_matrix[np.arange(my_matrix.shape[0]), col_idx]
Out[11]: array([2, 4])

答案 1 :(得分:2)

np.choose对于进行这些选择非常有用:

>>> np.choose(col_idx, my_matrix.T)
array([2, 4])

在一个更大的矩阵上:

>>> my_matrix_2 = np.array([[1, 2], [4, 5], [3, 7], [4, 1]])
>>> col_idx_2 = np.array([1, 0, 0, 1])
>>> np.choose(col_idx_2, my_matrix_2.T)
array([2, 4, 3, 1])

该方法返回一个包含所选值的新数组(不是原始数组的视图)。


文档中有更多这种(最初略显不明显)的方法,但我将使用上面的第二个例子解释发生了什么。

我们正在使用np.choose从名为my_matrix_2.T的选项数组中返回一个新数组,其中col_idx_2指定我们应该从每次选择的数组行中选择哪一行。

请注意,我们会将my_matrix_2转换为此作品:

# my_matrix_2.T
array([[1, 4, 3, 4],  # row 0
       [2, 5, 7, 1]]) # row 1

我们有col_idx_2 = [1, 0, 0, 1]。现在逐步遍历此数组一个值:

  • 新数组的第一个元素将是1的行my_matrix_2.T第一个元素。这是2

  • 新数组的第二个元素将是0的行my_matrix_2.T第二个元素。这是4

  • 新数组的第三个​​元素将是0的行my_matrix_2.T第三个​​元素。这是3

  • 新数组的第四个元素将是1的行my_matrix_2.T第四个元素。这是1

因此该方法返回array([2, 4, 3, 1])

答案 2 :(得分:0)

In [211]: M = np.array([[1, 2], [4, 5]])

In [212]: cid = [1, 0]

In [213]: M[[list(i) for i in zip(range(M.shape[0]), cid)]]
Out[213]: array([2, 4])