假设我有以下内容:
a = np.array([0,0,64,64,100,100,130,130,0,183,208,0,255])
我希望从此数组中删除单个特定值,例如,单个130
产量:
[0,0,64,64,100,100,130,0,183,208,0,255]
删除无关紧要。
我不希望删除所有'130',在此示例中(即不 a[a != 130]
)。
计算效率是一个值得关注的问题,因为我有一些大型阵列可以通过。
答案 0 :(得分:2)
使用最后一个元素交换元素,然后调整数组大小。
我使用天真的ndarray.delete函数做了一个小测试,例如:
A = numpy.delete(A, 1)
与交换
A[1] = A[-1]
A.resize((len(A) - 1,))
编辑:@YXD建议用创建视图替换调整大小
A[1] = A[-1]
A = A[:-1]
哪个好多了(只是我对numpy的了解有限)并在我的答案结尾处很好地打包了这个建议。
后者破坏了数组的排序,但是对于每次删除都不需要memcpy
数组的大部分。
小型性能测试:
# Naïve approach
print timeit.timeit("""
import numpy
A = numpy.array(range(0,10000))
while len(A) > 10:
A = numpy.delete(A, 1)
""", number=10)
# Swap, resize
print timeit.timeit("""
import numpy
A = numpy.array(range(0,10000))
while len(A) > 10:
A[1] = A[-1]
A.resize((len(A) - 1,))
""", number=10)
# Swap, create view
print timeit.timeit("""
import numpy
A = numpy.array(range(0,10000))
while len(A) > 10:
A[1] = A[-1]
A = A[:-1]
""", number=10)
>>> 2.52913403511
>>> 0.14426112175
>>> 0.0972230434418
所以看起来ndarray
实际上是作为C数组实现的(当然这很有意义)。交换是我很久以前学到的旧C技巧:)
答案 1 :(得分:0)
您无法删除数组元素。相反,您可以创建包含所有所需元素的辅助数组,然后删除原始数组。