我有一个矩阵2d-np。数组,我想删除在特定列中包含元素x的所有行。我的目标是返回一个没有这些行的矩阵,所以它应该更小。我的函数是这样的:
def delete_rows(matrix, x, col):
for i in range(matrix.shape[0]-1):
if(matrix[i,col] == x):
np.delete(matrix, i, axis = 0)
return matrix
可悲的是,在我的测试中,矩阵的形状在删除行后保持不变。我认为被删除的行是用0代替的。对我如何实现我的目标有什么建议吗?
EDIT:增加了检查特定列
的条件您不需要为此使用任何apply方法。它可以通过下面的基本布尔索引来解决:
arr[~(arr[:,col] == val),:]
arr[:,col]
从数组 中选择特定列arr[:,col] == val
检查值并返回存在的True
,否则False
~(arr[:,col] == val)
逆True
和False
arr[~(arr[:,col] == val),:]
只保留布尔索引为True
的行,丢弃所有False
示例解决方案
arr = np.array([[12, 10, 12, 0, 9, 4, 12, 11],
[ 3, 10, 14, 5, 4, 3, 6, 6],
[12, 10, 1, 0, 5, 7, 5, 10],
[12, 8, 14, 14, 12, 3, 14, 10],
[ 9, 14, 3, 8, 1, 10, 9, 6],
[10, 3, 11, 3, 12, 13, 11, 10],
[ 0, 6, 8, 8, 5, 5, 1, 10], #<- this to remove
[13, 6, 1, 10, 7, 10, 10, 13],
[ 3, 3, 8, 10, 13, 0, 0, 10], #<- this to remove
[ 6, 2, 13, 5, 8, 2, 8, 10]])
# ^
# this column to check
#boolean indexing approach
val, col = 8,2 #value to check is 8 and column to check is 2
out = arr[~(arr[:,col] == val),:] #<-----
out
array([[12, 10, 12, 0, 9, 4, 12, 11],
[ 3, 10, 14, 5, 4, 3, 6, 6],
[12, 10, 1, 0, 5, 7, 5, 10],
[12, 8, 14, 14, 12, 3, 14, 10],
[ 9, 14, 3, 8, 1, 10, 9, 6],
[10, 3, 11, 3, 12, 13, 11, 10],
[13, 6, 1, 10, 7, 10, 10, 13],
[ 6, 2, 13, 5, 8, 2, 8, 10]])
如果你想检查所有列的值,那么试试这个-
arr[~(arr == val).any(1),:]
如果您想只保留具有该值的行,只需从条件中删除~
。
arr[(arr[:,col] == val),:]
如果你想删除列,使用np.delete
-
np.delete(arr[~(arr[:,col] == val),], col, axis=1)
注意:您不能使用
np.delete
同时删除行和列,所以如果您打算使用它,您需要执行两次np.delete
,一次为axis = 0(行),一次为axis = 1(列)
假设你有一个这样的数组:
array([[12, 5, 0, 3, 11, 3, 7, 9, 3, 5],
[ 2, 4, 7, 6, 8, 8, 12, 10, 1, 6],
[ 7, 7, 14, 8, 1, 5, 9, 13, 8, 9],
[ 4, 3, 0, 3, 5, 14, 0, 2, 3, 8],
[ 1, 3, 13, 3, 3, 14, 7, 0, 1, 9],
[ 9, 0, 10, 4, 7, 3, 14, 11, 2, 7],
[12, 2, 0, 0, 4, 5, 5, 6, 8, 4],
[ 1, 4, 9, 10, 10, 8, 1, 1, 7, 9],
[ 9, 3, 6, 7, 11, 14, 2, 11, 0, 14],
[ 3, 5, 12, 9, 10, 4, 11, 4, 6, 4]])
你可以像这样删除所有包含3的行:
row_mask = np.apply_along_axis(np.any, 1, arr == 3)
arr = arr[~row_mask]
你的新数组看起来像这样
array([[ 2, 4, 7, 6, 8, 8, 12, 10, 1, 6],
[ 7, 7, 14, 8, 1, 5, 9, 13, 8, 9],
[12, 2, 0, 0, 4, 5, 5, 6, 8, 4],
[ 1, 4, 9, 10, 10, 8, 1, 1, 7, 9]])
这可以简单地在一行中完成:
import numpy as np
def delete_rows(matrix, x, col):
return matrix[matrix[:,col]!=x,:]
例如,如果我们想从矩阵A
中删除所有在第二列中包含5的行:
>>> A = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> print(delete_rows(A, 5, 1))
[[1 2 3]
[7 8 9]]