Gunakan numpy.delete () - mengembalikan array baru dengan sub-array sepanjang sumbu dihapus
numpy.delete(a, index)
Untuk pertanyaan spesifik Anda:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = [2, 3, 6]
new_a = np.delete(a, index)
print(new_a) #Prints `[1, 2, 5, 6, 8, 9]`
Perhatikan bahwa numpy.delete()
mengembalikan array baru karena skalar array tidak dapat diubah, mirip dengan string dalam Python, jadi setiap kali perubahan dibuat untuk itu, objek baru dibuat. Yaitu, mengutip delete()
dokumen :
" Salinan arr dengan elemen yang ditentukan oleh obj dihapus. Perhatikan bahwa penghapusan tidak terjadi di tempat ..."
Jika kode yang saya posting memiliki output, itu adalah hasil menjalankan kode.
Ada fungsi built-in numpy untuk membantu dengan itu.
sumber
np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))
Array Numpy tidak dapat diubah , artinya Anda secara teknis tidak dapat menghapus item darinya. Namun, Anda dapat membuat array baru tanpa nilai yang tidak Anda inginkan, seperti ini:
sumber
a[0]=1
memodifikasia
di tempat. Tapi mereka tidak bisa diubah ukurannya.Untuk menghapus berdasarkan nilai:
sumber
Tidak menjadi orang yang numpy, saya mengambil foto dengan:
Menurut tes saya, ini mengungguli
numpy.delete()
. Saya tidak tahu mengapa itu akan terjadi, mungkin karena ukuran kecil array awal?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.Sunting: Tampaknya memang ada hubungannya dengan ukuran array. Dengan array besar,
numpy.delete()
secara signifikan lebih cepat.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.
sumber
a = delte_stuff(a)
iterasi pertama Anda, yang membuatnyaa
lebih kecil dengan setiap iterasi. Ketika Anda menggunakan fungsi inbuild, Anda tidak menyimpan nilai kembali ke, yang membuat ukuran aslinya! Selain itu, Anda dapat mempercepat fungsi Anda secara drastis, saat Anda membuat kumpulanindex
dan mengeceknya, apakah akan menghapus item atau tidak. Memperbaiki kedua hal, saya dapatkan untuk 10k item: 6,22 msec per loop dengan fungsi Anda, 4,48 msec untuknumpy.delete
, yang kira-kira seperti apa yang Anda harapkan.np.array(list(range(x)))
digunakannp.arange(x)
, dan untuk membuat indeks, Anda dapat menggunakannp.s_[::2]
.Jika Anda tidak tahu indeksnya, Anda tidak bisa menggunakannya
logical_and
sumber
Menggunakan
np.delete
adalah cara tercepat untuk melakukannya, jika kita tahu indeks elemen yang ingin kita hapus. Namun, untuk kelengkapan, izinkan saya menambahkan cara lain "menghapus" elemen array menggunakan topeng boolean yang dibuat dengan bantuannp.isin
. Metode ini memungkinkan kami untuk menghapus elemen dengan menentukan secara langsung atau dengan indeks mereka:Hapus berdasarkan indeks :
Hapus berdasarkan elemen (jangan lupa untuk membuat ulang yang asli
a
karena sudah ditulis ulang di baris sebelumnya):sumber
Hapus indeks spesifik (saya menghapus 16 dan 21 dari matriks)
Keluaran:
sumber
Anda juga dapat menggunakan set:
sumber