【问题标题】:Slicing non-continous indexes in 2d Numpy array在 2d Numpy 数组中切片非连续索引
【发布时间】:2020-04-13 09:06:46
【问题描述】:

我有一个矩阵,即 2D numpy 数组,并且希望能够切出它的非连续部分。例如下面的矩阵

[[11 12 13 14 15]
 [21 22 23 24 25]
 [31 32 33 34 35]
 [41 42 43 44 45]
 [51 52 53 54 55]]

我希望能够提取,比如说

[[11 12 14 15]
 [21 22 24 25]
 [51 52 54 55]]

有没有办法做到这一点? 我可以轻松提取连续切片,例如 matrix[0:2,0:3] 会返回

[[11 12 13]
 [21 22 23]

但不确定如何提取非连续的。我阅读了有关使用 np.r_[] 的信息,如果仅在一个维度上使用,它就可以工作,但不能在两个维度上使用。

该解决方案需要具有可扩展性,并且必须用于具有许多非连续索引的大型矩阵(我认为这将作为列表传递)。

【问题讨论】:

    标签: python numpy matrix slice


    【解决方案1】:

    您可以使用链式索引:

    arr = np.array([[11, 12, 13, 14, 15],
           [21, 22, 23, 24, 25],
           [31, 32, 33, 34, 35],
           [41, 42, 43, 44, 45],
           [51, 52, 53, 54, 55]])
    
    In [28]: arr[[0,1,4]][:, [0,1,3,4]]                                                                       
    Out[28]: 
    array([[11, 12, 14, 15],
           [21, 22, 24, 25],
           [51, 52, 54, 55]])
    

    【讨论】:

      【解决方案2】:

      您可以使用 NumPy 的 advanced indexingix_() 函数来索引两个一维序列的叉积,第一个包含要提取的行的索引,第二个包含列的索引.

      In [24]: import numpy as np
      
      In [25]: arr = np.asarray([[11, 12, 13, 14, 15], 
          ...:                   [21, 22, 23, 24, 25], 
          ...:                   [31, 32, 33, 34, 35], 
          ...:                   [41, 42, 43, 44, 45], 
          ...:                   [51, 52, 53, 54, 55]])
          ...: 
      
      In [26]: rows = [0, 1, 4]
      
      In [27]: cols = [0, 1, 3, 4]
      
      In [28]: arr[np.ix_(rows, cols)]
      Out[28]: 
      array([[11, 12, 14, 15],
             [21, 22, 24, 25],
             [51, 52, 54, 55]])
      

      值得指出的是,将上述方法扩展到索引 N 维数组很简单。您只需将更多的一维序列传递给np.ix_

      【讨论】:

        【解决方案3】:

        您可以这样做,并且您的列表想法与它完美配合。在 delete 中,你可以传递一个列表而不是仅仅传递 2

        q = np.array([[11, 12, 13, 14, 15],
               [21, 22, 23, 24, 25],
               [31, 32, 33, 34, 35],
               [41, 42, 43, 44, 45],
               [51, 52, 53, 54, 55]])
        
        np.delete(q,2, axis=1)[np.array([0,1,4])]                                                                                                                                           
        
        array([[11, 12, 14, 15],
               [21, 22, 24, 25],
               [51, 52, 54, 55]])
        

        【讨论】:

          猜你喜欢
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 2017-08-09
          • 2022-10-04
          • 2011-10-09
          • 2019-10-31
          • 2021-06-29
          • 2021-12-21
          相关资源
          最近更新 更多