Không phải là một người khó chịu, tôi đã chụp:
>>> import numpy as np
>>> import itertools
>>>
>>> a = np.array([1,2,3,4,5,6,7,8,9])
>>> index=[2,3,6]
>>> a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))
>>> a
array([1, 2, 5, 6, 8, 9])
Theo thử nghiệm của tôi, điều này vượt trội hơn numpy.delete()
. Tôi không biết tại sao lại như vậy, có thể là do kích thước nhỏ của mảng ban đầu?
python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
100000 loops, best of 3: 12.9 usec per loop
python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "np.delete(a, index)"
10000 loops, best of 3: 108 usec per loop
Đó là một sự khác biệt khá đáng kể (theo hướng ngược lại với những gì tôi đang mong đợi), có ai biết tại sao lại như vậy không?
Thậm chí kỳ lạ hơn, việc vượt qua numpy.delete()
một danh sách thực hiện tồi tệ hơn là lặp qua danh sách và đưa ra chỉ số duy nhất.
python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "for i in index:" " np.delete(a, i)"
10000 loops, best of 3: 33.8 usec per loop
Chỉnh sửa: Nó dường như là để làm với kích thước của mảng. Với mảng lớn, numpy.delete()
nhanh hơn đáng kể.
python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
10 loops, best of 3: 200 msec per loop
python -m timeit -s "import numpy as np" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "np.delete(a, index)"
1000 loops, best of 3: 1.68 msec per loop
Rõ ràng, điều này hoàn toàn không liên quan, vì bạn nên luôn luôn đi cho rõ ràng và tránh phát minh lại bánh xe, nhưng tôi thấy nó hơi thú vị, vì vậy tôi nghĩ tôi sẽ để nó ở đây.