从 ndarray Python 2.7 中删除列和行

Removing columns and rows from ndarray Python 2.7

提问人:Rafael Valero 提问时间:1/25/2018 最后编辑:marc_sRafael Valero 更新时间:1/29/2018 访问量:110

问:

我已经实现了算法,可以在 Python 2.7 中从 ndarray 中删除一些列和行,但是我觉得应该有更好的方法可以做到这一点。可能我不知道如何在 Python 中做好它,这就是我在这里提出问题的原因。我一直在搜索,但我没有成功找到类似的问题和文档(例如,在 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))
    

    Matlab 中的这一步将更简单,只需使用 ~ 对矩阵的索引进行切片(在 python ndarray 中)。有没有更好的方法可以做到这一点?

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

    a[rows_to_keep,:][:,columns_to_keep]
    

输出:

array([[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]

谢谢

python-2.7 多列 切片 numpy-ndarray

评论

0赞 Rafael Valero 1/26/2018
切片说明:NumPy 2d 数组的切片,或者如何从 nxn 数组 (n>m) 中提取 mxm 子矩阵?(stackoverflow.com/questions/4257394/...)

答:

0赞 I.Seck 1/25/2018 #1

您可以使用 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 包含输出数组,你想要!!

评论

0赞 Rafael Valero 1/25/2018
谢谢。出于不同的原因,我不应该这样做:a)该位置对于追溯数据很有用。b) 稍后我想使用整个矩阵。愿你安好
0赞 I.Seck 1/25/2018
在使用 delete 方法之前,可以将要删除的行和列的位置放在变量中。你还不如保留原来的矩阵!
0赞 Rafael Valero 1/26/2018
没错,但它是一个大矩阵,从内存的角度来看,它可能是不足的。
0赞 Rafael Valero 1/29/2018 #2

对于问题 2)

而不是:

a[rows_to_keep,:][:,columns_to_keep]

用:

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

这称为高级索引(请参阅 [Numpy 文档1以最 pythonian 的方式在 ndarray 的子 ndarray 中写入。Python 2 中文文档)

对于问题 1) 我将使用问题 2 上一个解决方案: a) 创建掩码,有更优雅的方法可以做到这一点,例如,为了简单起见,请参阅从数组创建布尔掩码

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))