Tidak menjadi orang yang numpy, saya mengambil foto dengan:
>>> 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])
Menurut tes saya, ini mengungguli numpy.delete()
. Saya tidak tahu mengapa itu akan terjadi, mungkin karena ukuran kecil array awal?
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
Itu perbedaan yang cukup signifikan (berlawanan arah dengan apa yang saya harapkan), ada yang tahu mengapa ini akan terjadi?
Yang lebih aneh, melewati numpy.delete()
daftar berkinerja lebih buruk daripada mengulang-ulang daftar dan memberikannya indeks tunggal.
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
Sunting: Tampaknya memang ada hubungannya dengan ukuran array. Dengan array besar, numpy.delete()
secara signifikan lebih cepat.
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
Jelas, ini semua sangat tidak relevan, karena Anda harus selalu mencari kejelasan dan menghindari menciptakan kembali roda, tetapi saya menemukan itu sedikit menarik, jadi saya pikir saya akan meninggalkannya di sini.