【问题标题】:How to select specific column indices from a matrix?如何从矩阵中选择特定的列索引?
【发布时间】:2017-01-07 22:47:11
【问题描述】:

我有一个矩阵和一个列索引列表,我想从矩阵中为每一行选择它们。我如何在 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])

【问题讨论】:

  • my_matrix[range(col_idx.size), col_idx] 应该可以完成这项工作。
  • @iluengo:这更像是一个答案而不是评论。

标签: python arrays numpy


【解决方案1】:

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

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

【讨论】:

    【解决方案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]。现在一次遍历这个数组一个值:

    • 新数组的first 元素将是my_matrix_2.T1 行的first 元素。这是2

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

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

    • 新数组的 fourth 元素将是 1 的行 my_matrix_2.Tfourth 元素。这是1

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

    【讨论】:

      【解决方案3】:
      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])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-04
        • 1970-01-01
        • 1970-01-01
        • 2019-09-18
        • 2011-03-17
        相关资源
        最近更新 更多