从 ndarray Python 2.7 中删除列和行
Removing columns and rows from ndarray Python 2.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 的一些列 and/or 行。特别是我想删除第 0 列和第 1 行,这是一个像这样的输出:
array([[1, 2],
[7, 8]])
为此,我遵循以下步骤,但它们看起来不太优雅,我觉得它们应该是更好的实现。
我select要删除列和行,在这个例子中:
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 中)。 有更好的方法吗?.
然后我select保留那些列和行:
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]
不同,这对我来说有点刺耳。
是否有更好的方法来完成这些步骤?
非常感谢
您可以使用 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)
而不是:
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) 创建一个面具,有更优雅的方式来做到这一点,例如见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))
我已经在 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 的一些列 and/or 行。特别是我想删除第 0 列和第 1 行,这是一个像这样的输出:
array([[1, 2],
[7, 8]])
为此,我遵循以下步骤,但它们看起来不太优雅,我觉得它们应该是更好的实现。
我select要删除列和行,在这个例子中:
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 中)。 有更好的方法吗?.
然后我select保留那些列和行:
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]
不同,这对我来说有点刺耳。
是否有更好的方法来完成这些步骤?
非常感谢
您可以使用 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)
而不是:
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) 创建一个面具,有更优雅的方式来做到这一点,例如见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))