我有一个矩阵和一列列索引,我想从矩阵中为每一行选择。我怎么能在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])
答案 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])