详细查看每次删除会发生什么:
In [43]: a
Out[43]: array([ 1, 2, -3, 4, -5])
In [44]: b=a
In [45]: a[2]
Out[45]: -3
In [46]: b=np.delete(b, a[2])
In [47]: b
Out[47]: array([ 1, 2, 4, -5])
In [48]: a[4]
Out[48]: -5
In [49]: b=np.delete(b, a[4])
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-49-a326bbe5d5c9> in <module>
----> 1 b=np.delete(b, a[4])
/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py in delete(arr, obj, axis)
4374 raise IndexError(
4375 "index %i is out of bounds for axis %i with "
-> 4376 "size %i" % (obj, axis, N))
4377 if (obj < 0):
4378 obj += N
IndexError: index -5 is out of bounds for axis 0 with size 4
delete 每次都会创建一个新数组。这使得它比类似的列表方法慢。但这确实意味着a 不会改变。
np.delete 采用索引,而不是值(它与列表 del 不同)。 a[2] 恰好可以工作,因为 a[-3] 是 [-3]。 a[4] 是 -5,它不是大小为 4 b 的有效索引。
如果我们指定索引而不是值,删除工作正常:
In [51]: b=a
In [52]: b=np.delete(b, 2)
In [53]: b
Out[53]: array([ 1, 2, 4, -5])
In [54]: b=np.delete(b, 3)
In [55]: b
Out[55]: array([1, 2, 4])
但是重复的delete 很慢;最好一次删除所有负数:
In [56]: a
Out[56]: array([ 1, 2, -3, 4, -5])
In [57]: np.delete(a,[2,4])
Out[57]: array([1, 2, 4])
我们可以使用where 来获取索引:
In [65]: a<0
Out[65]: array([False, False, True, False, True])
In [66]: np.where(a<0)
Out[66]: (array([2, 4]),)
In [67]: np.delete(a, np.where(a<0))
Out[67]: array([1, 2, 4])
但是我们可以直接使用掩码:
In [68]: a[~(a<0)]
Out[68]: array([1, 2, 4])
对于一个列表,一个简单的列表推导效果很好:
In [69]: b = a.tolist()
In [70]: [i for i in b if not i<0]
Out[70]: [1, 2, 4]
另一个众所周知的列表技巧是从末尾迭代,这样任何删除都不会弄乱剩余的列表。