Misalkan saya punya array numpy x = [5, 2, 3, 1, 4, 5]
, y = ['f', 'o', 'o', 'b', 'a', 'r']
. Saya ingin memilih elemen yang y
sesuai dengan elemen dalamx
yang lebih besar dari 1 dan kurang dari 5.
Saya mencoba
x = array([5, 2, 3, 1, 4, 5])
y = array(['f','o','o','b','a','r'])
output = y[x > 1 & x < 5] # desired output is ['o','o','a']
tetapi ini tidak berhasil. Bagaimana saya melakukan ini?
&
memiliki prioritas lebih tinggi dari<
dan>
, yang pada gilirannya memiliki prioritas lebih tinggi daripada (logis)and
.x > 1 and x < 5
mengevaluasikan ketidaksetaraan pertama dan kemudian konjungsi logis;x > 1 & x < 5
mengevaluasi konjungsi bitwise dari1
dan (nilai-nilai dalam)x
, maka ketidaksetaraan.(x > 1) & (x < 5)
memaksa ketidaksetaraan untuk mengevaluasi terlebih dahulu, sehingga semua operasi terjadi dalam urutan yang dimaksudkan dan hasilnya semua didefinisikan dengan baik. Lihat dokumen di sini.(0 < x) & (x < 10)
(seperti yang ditunjukkan dalam jawaban) alih-alih0 < x < 10
yang tidak bekerja untuk array numpy pada versi Python.IMO OP tidak benar-benar ingin
np.bitwise_and()
(alias&
) tetapi sebenarnya inginnp.logical_and()
karena mereka membandingkan nilai-nilai logis sepertiTrue
danFalse
- lihat posting SO ini pada logis vs bitwise untuk melihat perbedaannya.Dan cara yang setara untuk melakukan ini adalah dengan
np.all()
mengaturaxis
argumen dengan tepat.dengan angka:
jadi menggunakan
np.all()
lebih lambat, tetapi&
danlogical_and
hampir sama.sumber
output = y[np.logical_and(x > 1, x < 5)]
,x < 5
adalah dievaluasi (mungkin menciptakan sebuah array yang sangat besar), meskipun itu argumen kedua, karena evaluasi yang terjadi di luar fungsi. TKI,logical_and
melewati dua argumen yang sudah dievaluasi. Ini berbeda dari kasus biasaa and b
, di manab
tidak dievaluasi apakaha
benar trike.Tambahkan satu detail ke jawaban @JF Sebastian dan @Mark Mikofski:
Jika seseorang ingin mendapatkan indeks yang sesuai (bukan nilai aktual array), kode berikut akan melakukannya:
Untuk memuaskan beberapa (semua) kondisi:
Untuk memenuhi beberapa (atau) kondisi:
sumber
(the array of indices you want,)
,, jadi Anda harusselect_indices = np.where(...)[0]
mendapatkan hasil yang Anda inginkan dan berharap.Saya suka menggunakan
np.vectorize
untuk tugas-tugas seperti itu. Pertimbangkan yang berikut ini:Keuntungannya adalah Anda dapat menambahkan lebih banyak jenis kendala dalam fungsi vektor.
Semoga ini bisa membantu.
sumber
Sebenarnya saya akan melakukannya dengan cara ini:
L1 adalah daftar indeks elemen yang memenuhi kondisi 1; (mungkin Anda dapat menggunakan
somelist.index(condition1)
ataunp.where(condition1)
untuk mendapatkan L1.)Demikian pula, Anda mendapatkan L2, daftar elemen yang memenuhi syarat 2;
Kemudian Anda menemukan persimpangan menggunakan
intersect(L1,L2)
.Anda juga dapat menemukan persimpangan beberapa daftar jika Anda memenuhi beberapa persyaratan.
Kemudian Anda bisa menerapkan indeks di larik lain, misalnya, x.
sumber
Untuk array 2D, Anda bisa melakukan ini. Buat topeng 2D menggunakan kondisinya. Ketikkan masker kondisi ke int atau float, tergantung pada array, dan kalikan dengan array asli.
sumber