代码之家  ›  专栏  ›  技术社区  ›  Rafael Valero

从ndarray Python 2.7中删除列和行

  •  0
  • Rafael Valero  · 技术社区  · 7 年前

    我已经在Python 2.7中实现了从ndarray中删除一些列和行的算法,但是我觉得应该有更好的方法。可能我不知道如何在Python中做好这件事,这就是为什么我在这里提出这些问题。我一直在搜索,但没有成功地在文档中找到类似的问题(例如 slicing and indexing documentation from scipy )

    假设我有一个包含一些行和列的ndarray:

    number_of_rows = 3
    number_of_columns = 3
    a = np.arange(number_of_rows*number_of_columns).reshape(number_of_rows,number_of_columns)
    a
    

    哪个输出是:

    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    

    让我们补充一下,我想删除前一个ndarray的一些列和/或行。我特别想删除第0列和第1行,这是一个如下输出:

    array([[1, 2],
           [7, 8]])
    

    要做到这一点,我遵循以下步骤,但是它们看起来太不优雅了,我觉得它们应该是更好的实现。

    1. 在本例中,我选择要删除的列和行:

      rows_to_remove = [1]
      columns_to_remove = [0]
      
    2. 现在,我创建了两个列表,其中包含要保留的列和行。

      rows_to_keep = list(set(range(0,a.shape[0]))-set(rows_to_remove))
      columns_to_keep = list(set(range(0,a.shape[1]))-set(columns_to_remove))
      

      通过使用~对矩阵的索引进行切片(在python ndarray中),Matlab中的这一步骤将更加简单。 有没有更好的方法? .

    3. 然后选择要保留的列和行:

      a[rows_to_keep,:][:,columns_to_keep]
      

    输出:

    数组([[1,2],
    [7, 8]])
    

    请注意,如果您只写:

    a[rows_to_keep,columns_to_keep]
    

    哪个输出是:

    array([1, 8])
    

    这对我来说有点像袜子 a[rows_to_keep,columns_to_keep] 不同于 a[rows_to_keep,:][:,columns_to_keep] . 有没有更好的方法来覆盖这些步骤?

    非常感谢你

    2 回复  |  直到 7 年前
        1
  •  0
  •   I.Seck    7 年前

    您可以使用delete方法完成此操作: 以问题中给出的数组为例。它是这样的:

    number_of_rows = 3
    number_of_columns = 3
    a=np.arange(number_of_rows*number_of_columns).reshape(number_of_rows,number_of_columns)
    b=np.delete(a,1,0)
    b=np.delete(b,0,1)
    

    瞧,b包含你想要的输出数组!!

        2
  •  0
  •   Rafael Valero    7 年前

    对于 问题2)

    而不是:

    a[rows_to_keep,:][:,columns_to_keep]
    

    使用:

    a[np.ix_(rows_to_keep,columns_to_keep)].
    

    这称为高级索引(请参阅[Numpy文档 1 Writting in sub-ndarray of a ndarray in the most pythonian way. Python 2 )

    对于 问题1) 我将使用问题2之前的解决方案: a) 创建一个面具,有更优雅的方法,例如看 Create a boolean mask from an array ,但为了简单起见:

    mask = np.zeros(a.shape,dtype=bool)
    mask[rows_to_remove,:] = True
    mask[:,columns_to_remove] = True 
    

    现在,您可以可视化:

    a[~np.array(mask)] 
    

    请注意,现在不需要回答问题2)。

    总结 :

    mask = np.zeros(a.shape,dtype=bool)
    mask[rows_to_remove,:] = True
    mask[:,columns_to_remove] = True 
    a[~np.array(mask)] 
    

    如果需要,您可以重塑:

    a[~np.array(mask)].reshape(a.shape[0]-len(rows_to_remove),a.shape[1]-len(columns_to_remove))