如何在不知道索引的情况下从numpy数组中删除对象

bpzcxfmw  于 2023-03-08  发布在  其他
关注(0)|答案(6)|浏览(129)

有没有可能从numpy数组中删除一个对象,而不知道对象的索引,而是知道对象本身?
我已经看到,使用np.delete函数可以使用对象的索引,但我正在寻找一种方法,使它只包含对象而不包含它的索引。
示例:
[a、b、c、d、e、f]
x = e
我想删除x

hlswsv35

hlswsv351#

您可以使用np.argwhere查找对象的索引,然后使用np.delete删除对象。
示例:

x = np.array([1,2,3,4,5])
index = np.argwhere(x==3)
y = np.delete(x, index)
print(x, y)
yjghlzjz

yjghlzjz2#

将其转换为numpy数组,并将其屏蔽

x = np.array(list("abcdef"))

x = x[x!='e']  # <-- THIS IS THE METHOD

print x
# array(['a', 'b', 'c', 'd', 'f'])

没必要比这更复杂。

fafcakar

fafcakar3#

布尔索引或掩码是选择或删除数组中特定元素的一种很好的基本方法
我们讨论删除一个特定的'object',让我们从字面上理解并定义一个dtype对象数组:

In [2]: x=np.array(['a','b','c','d','e'],dtype=object)
In [3]: x
Out[3]: array(['a', 'b', 'c', 'd', 'e'], dtype=object)
In [4]: x=='d'   # elements that equal 'd'
Out[4]: array([False, False, False,  True, False], dtype=bool)
In [5]: x!='d'    # elements that don't
Out[5]: array([ True,  True,  True, False,  True], dtype=bool)
In [6]: x[x!='d']   # select a subset
Out[6]: array(['a', 'b', 'c', 'e'], dtype=object)

argwheredelete在幕后使用了这个函数,注意argwhere使用了x==d的布尔数组,将其转换为数组索引,这样构造掩码是delete的一种操作方式。
存在一些重要限制:

  • 相等(或不相等)测试必须对你的值起作用。2如果元素是浮点型的,它可能不起作用。
  • 从一维数组中删除比从二维(或更大)数组中删除更容易。2使用二维数组时,你必须决定是否删除一行、一列或一个元素(并且在这个过程中要将数组扁平化)。
  • 只删除匹配的一个元素有点麻烦。

在某些情况下,.tolist()数组并使用列表方法可能更好。

In [32]: xl=x.tolist()
In [33]: xl.remove('d')
In [34]: np.array(xl,dtype=object)
Out[34]: array(['a', 'b', 'c', 'e'], dtype=object)

对于数组,没有与list.remove完全等价的函数。

qltillow

qltillow4#

你可以使用np.setdiff1d(a,b),它返回a中所有不存在于B中的unique元素。

>>> arr = np.array(['a', 'a', 'b', 'c', 'd', 'e', 'f'])
>>> to_remove = ['b', 'c']
>>> np.setdiff1d(arr, to_remove)
array(['a', 'd', 'e', 'f'], dtype='<U1')
gzjq41n4

gzjq41n45#

arr = np.array(['a','b','c','d','e','f'])
然后
arr = [x for x in arr if arr != 'e']

4nkexdtk

4nkexdtk6#

如果你有一个多维np数组:

arr= np.array([1,2,3,], [1,2,3,4],['a','b'])

应按以下方式删除特定值:

创建要删除的值的布尔掩码

mask = arr == 3

使用布尔掩码从数组中删除元素

new_arr = np.delete(arr, np.where(mask))

打印新数组

print(new_arr)

但在这种情况下,形状会发生变化。例如,如果我有(12,3)ndarray,它将被转换为(36,)。要像(12,3)一样保持固定:

创建要删除的值的布尔掩码

mask = arr == 3

展平布尔掩码

flat_mask = np.ravel(mask)

使用展平的布尔掩码从数组中删除元素

new_arr = np.delete(arr, np.where(flat_mask))

将新阵列重塑为原始形状

新排列=新排列整形(排列形状[0],排列形状[1])

打印新数组

print(new_arr)

我希望它对你有用。

相关问题