如何从阵列中轻松(并有效)删除单个元素?

时间:2015-07-21 12:20:21

标签: python numpy

假设我有以下内容:

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])。 计算效率是一个值得关注的问题,因为我有一些大型阵列可以通过。

2 个答案:

答案 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)

您无法删除数组元素。相反,您可以创建包含所有所需元素的辅助数组,然后删除原始数组。