删除2d-numpy数组中包含特定元素的行



我有一个矩阵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),:]
  1. arr[:,col]从数组
  2. 中选择特定列
  3. arr[:,col] == val检查值并返回存在的True,否则False
  4. ~(arr[:,col] == val)TrueFalse
  5. 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]]

最新更新