【发布时间】:2016-07-21 19:55:57
【问题描述】:
是否可以在不知道对象索引但知道对象本身的情况下从 numpy 数组中删除对象?
我已经看到可以使用 np.delete 函数使用对象的索引,但我正在寻找一种方法来使用对象而不是它的索引。
例子:
[a,b,c,d,e,f]
x = e
我想删除x。
【问题讨论】:
是否可以在不知道对象索引但知道对象本身的情况下从 numpy 数组中删除对象?
我已经看到可以使用 np.delete 函数使用对象的索引,但我正在寻找一种方法来使用对象而不是它的索引。
例子:
[a,b,c,d,e,f]
x = e
我想删除x。
【问题讨论】:
您可以使用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)
【讨论】:
b['A'] = b['A'].apply(lambda x: np.delete(x,np.argwhere(x=='')))
将其转换为 numpy 数组,并将其屏蔽:
x = np.array(list("abcdef"))
x = x[x!='e'] # <-- THIS IS THE METHOD
print x
# array(['a', 'b', 'c', 'd', 'f'])
不必比这更复杂。
【讨论】:
布尔索引或屏蔽是选择或删除数组特定元素的一种很好的基本方法
您谈论删除特定的“对象”。让我们从字面上理解并定义一个 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 运作的一种方式。
有一些重要的限制:
相等(或不相等)测试必须适用于您的价值观。如果元素是浮点数,则可能不会。
从一维数组中删除比从二维(或更大)数组中删除更容易。使用 2d,您必须决定是删除行、列还是元素(并在展平数组的过程中)。
只删除匹配的一个元素有点棘手。
在某些情况下,.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 完全等价的方法。
【讨论】:
您可以使用np.setdiff1d(a,b),它会返回 a 中不在 b 中的所有 唯一 元素。
>>> 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')
【讨论】:
arr = np.array(['a','b','c','d','e','f'])
然后
arr = [x for x in arr if arr != 'e']
【讨论】: