有没有可能从numpy数组中删除一个对象,而不知道对象的索引,而是知道对象本身?我已经看到,使用np.delete函数可以使用对象的索引,但我正在寻找一种方法,使它只包含对象而不包含它的索引。示例:[a、b、c、d、e、f]x = e我想删除x。
x
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)
yjghlzjz2#
将其转换为numpy数组,并将其屏蔽:
x = np.array(list("abcdef")) x = x[x!='e'] # <-- THIS IS THE METHOD print x # array(['a', 'b', 'c', 'd', 'f'])
没必要比这更复杂。
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)
argwhere和delete在幕后使用了这个函数,注意argwhere使用了x==d的布尔数组,将其转换为数组索引,这样构造掩码是delete的一种操作方式。存在一些重要限制:
argwhere
delete
x==d
在某些情况下,.tolist()数组并使用列表方法可能更好。
.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完全等价的函数。
list.remove
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')
gzjq41n45#
arr = np.array(['a','b','c','d','e','f'])然后arr = [x for x in arr if arr != 'e']
arr = np.array(['a','b','c','d','e','f'])
arr = [x for x in arr if arr != 'e']
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)
flat_mask = np.ravel(mask)
new_arr = np.delete(arr, np.where(flat_mask))
新排列=新排列整形(排列形状[0],排列形状[1])
我希望它对你有用。
6条答案
按热度按时间hlswsv351#
您可以使用np.argwhere查找对象的索引,然后使用np.delete删除对象。
示例:
yjghlzjz2#
将其转换为numpy数组,并将其屏蔽:
没必要比这更复杂。
fafcakar3#
布尔索引或掩码是选择或删除数组中特定元素的一种很好的基本方法
我们讨论删除一个特定的'object',让我们从字面上理解并定义一个dtype对象数组:
argwhere
和delete
在幕后使用了这个函数,注意argwhere
使用了x==d
的布尔数组,将其转换为数组索引,这样构造掩码是delete
的一种操作方式。存在一些重要限制:
在某些情况下,
.tolist()
数组并使用列表方法可能更好。对于数组,没有与
list.remove
完全等价的函数。qltillow4#
你可以使用np.setdiff1d(a,b),它返回a中所有不存在于B中的unique元素。
gzjq41n45#
arr = np.array(['a','b','c','d','e','f'])
然后
arr = [x for x in arr if arr != 'e']
4nkexdtk6#
如果你有一个多维np数组:
应按以下方式删除特定值:
创建要删除的值的布尔掩码
使用布尔掩码从数组中删除元素
打印新数组
但在这种情况下,形状会发生变化。例如,如果我有(12,3)ndarray,它将被转换为(36,)。要像(12,3)一样保持固定:
创建要删除的值的布尔掩码
展平布尔掩码
使用展平的布尔掩码从数组中删除元素
将新阵列重塑为原始形状
新排列=新排列整形(排列形状[0],排列形状[1])
打印新数组
我希望它对你有用。