我已经实现了算法来从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]])
要做到这一点,我按照以下步骤操作,但是它们看起来不太优雅,我认为它们应该是更好的实现。
我选择要移除的列和行,在此示例中为:
rows_to_remove = [1]
columns_to_remove = [0]
现在我创建了几个列表,其中包含要保留的列和行。
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中)。 有更好的方法吗?。
然后我选择要保留的列和行:
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]
不同。
是否有更好的方法来涵盖这些步骤?
非常感谢
答案 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文档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))