从ndarray Python 2.7

时间:2018-01-25 12:43:33

标签: python-2.7 multiple-columns rows slice numpy-ndarray

我已经实现了算法来从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))
    

    Matlab中的这一步将更简单,只需使用〜来切割矩阵的索引(在python ndarray中)。 有更好的方法吗?

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

    a[rows_to_keep,:][:,columns_to_keep]
    
  4. 输出:

    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]不同。 是否有更好的方法来涵盖这些步骤?

    非常感谢

2 个答案:

答案 0 :(得分:0)

您可以使用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)

和Voilà,b包含输出数组,你想要!!

答案 1 :(得分:0)

问题2)

而不是:

a[rows_to_keep,:][:,columns_to_keep]

使用:

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

这称为高级索引(请参阅[Numpy文档1Writting 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))