【发布时间】:2011-09-15 10:05:00
【问题描述】:
我有一个 NumPy 数组,我想检索除某个索引之外的所有元素。例如,考虑以下数组
a = [0,1,2,3,4,5,5,6,7,8,9]
如果我指定索引 3,那么结果应该是
a = [0,1,2,4,5,5,6,7,8,9]
【问题讨论】:
我有一个 NumPy 数组,我想检索除某个索引之外的所有元素。例如,考虑以下数组
a = [0,1,2,3,4,5,5,6,7,8,9]
如果我指定索引 3,那么结果应该是
a = [0,1,2,4,5,5,6,7,8,9]
【问题讨论】:
与调整大小一样,从 NumPy 数组中删除元素是一项缓慢的操作(尤其是对于大型数组,因为它需要分配空间并将所有数据从原始数组复制到新数组)。 应该尽量避免。
您通常可以通过使用masked array 来避免它。例如,考虑数组a:
import numpy as np
a = np.array([0,1,2,3,4,5,5,6,7,8,9])
print(a)
print(a.sum())
# [0 1 2 3 4 5 5 6 7 8 9]
# 50
我们可以在索引 3 处屏蔽它的值,并且可以执行求和忽略屏蔽的元素:
a = np.ma.array(a, mask=False)
a.mask[3] = True
print(a)
print(a.sum())
# [0 1 2 -- 4 5 5 6 7 8 9]
# 47
除了sum之外,掩码数组还支持many operations。
如果确实需要,也可以使用compressed 方法移除被屏蔽的元素:
print(a.compressed())
# [0 1 2 4 5 5 6 7 8 9]
但如上所述,尽可能避免。
【讨论】:
如果 a 是 NumPy 数组,则这是一个单行:
>>> a[np.arange(len(a))!=3]
array([0, 1, 2, 4, 5, 5, 6, 7, 8, 9])
【讨论】:
a_new = np.delete(a, 3, 0)
3 这里是您要删除的索引,0 是轴(如果使用一维数组,则在这种情况下为零)。见np.delete
【讨论】:
另一种解决方案是使用NumPy的concatenate函数:
>>> x = np.arange(0,10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> i = 3
>>> np.concatenate((x[:i],x[(i+1):]))
array([0, 1, 2, 4, 5, 6, 7, 8, 9])
【讨论】:
np.concatenate() 进行复制,因此在处理大型数据集时这不是很好。
应该这样做:
In [9]: np.hstack((a[:3], a[4:]))
Out[9]: array([0, 1, 2, 4, 5, 5, 6, 7, 8, 9])
如果性能是一个问题,以下将解决:
In [22]: a[3:-1] = a[4:]; a = a[:-1]
【讨论】: