numpy.where () terperinci, penjelasan / contoh langkah-demi-langkah [ditutup]

168

Saya mengalami kesulitan memahami dengan benar numpy.where()meskipun membaca dokumen , pos ini dan pos lainnya ini .

Dapatkah seseorang memberikan contoh komentar langkah demi langkah dengan array 1D dan 2D?

Alexandre Holden Daly
sumber

Jawaban:

272

Setelah bermain-main sebentar, saya mencari tahu, dan saya mempostingnya di sini berharap itu akan membantu orang lain.

Secara intuitif, np.whereseperti bertanya " beri tahu saya di mana dalam array ini, entri memenuhi kondisi yang diberikan ".

>>> a = np.arange(5,10)
>>> np.where(a < 8)       # tell me where in a, entries are < 8
(array([0, 1, 2]),)       # answer: entries indexed by 0, 1, 2

Itu juga dapat digunakan untuk mendapatkan entri dalam array yang memenuhi kondisi:

>>> a[np.where(a < 8)] 
array([5, 6, 7])          # selects from a entries 0, 1, 2

Ketika aarray 2d, np.where()mengembalikan array baris idx, dan array col idx:

>>> a = np.arange(4,10).reshape(2,3)
array([[4, 5, 6],
       [7, 8, 9]])
>>> np.where(a > 8)
(array(1), array(2))

Seperti dalam kasus 1d, kita bisa menggunakan np.where()untuk mendapatkan entri dalam array 2d yang memenuhi syarat:

>>> a[np.where(a > 8)] # selects from a entries 0, 1, 2

array ([9])


Catatan, ketika a1d, np.where()masih mengembalikan array baris idx dan array col idx, tetapi kolom panjangnya 1, jadi yang terakhir adalah array kosong.

Alexandre Holden Daly
sumber
10
Saya kesulitan memahami np.where ketika digunakan pada 2d sampai saya menemukan jawaban Anda "Ketika a adalah array 2d, np.where () mengembalikan array baris idx, dan array col idx's:". Terima kasih untuk itu.
bencampbell_14
1
Saya merasa sangat bodoh setelah membaca dokumen tiga kali dan masih belum menyelesaikan teka-teki np.where(2d_array), terima kasih telah membereskannya! Anda harus menerima jawaban Anda sendiri. e: Oh, sudah ditutup. Seharusnya tidak
smcs
5
Sayang ini sudah ditutup. Namun saya ingin menambahkan fitur lain np.whereuntuk jawaban yang dinyatakan lengkap ini. Fungsi juga dapat memilih elemen dari array x dan y tergantung pada kondisinya. Ruang terbatas dalam komentar ini tetapi lihat: np.where(np.array([[False,False,True], [True,False,False]]), np.array([[8,2,6], [9,5,0]]), np.array([[4,8,7], [3,2,1]]))akan kembali array([[4, 8, 6], [9, 2, 1]]). Perhatikan elemen x dan y mana yang dipilih tergantung pada True / False
piccolo
Penjelasan yang diberikan dalam jawaban ini hanya kasus khusus np.where. Menurut dokumentasi, Ketika hanya conditiondisediakan, fungsi ini adalah singkatan untuk np.asarray(condition).nonzero().
Lenny
19

Ini sedikit lebih menyenangkan. Saya telah menemukan bahwa NumPy sangat sering melakukan apa yang saya inginkan - kadang-kadang lebih cepat bagi saya untuk hanya mencoba sesuatu daripada membaca dokumen. Sebenarnya campuran keduanya adalah yang terbaik.

Saya pikir jawaban Anda baik-baik saja (dan tidak apa-apa untuk menerimanya jika Anda mau). Ini hanya "ekstra".

import numpy as np

a = np.arange(4,10).reshape(2,3)

wh = np.where(a>7)
gt = a>7
x  = np.where(gt)

print "wh: ", wh
print "gt: ", gt
print "x:  ", x

memberi:

wh:  (array([1, 1]), array([1, 2]))
gt:  [[False False False]
      [False  True  True]]
x:   (array([1, 1]), array([1, 2]))

... tetapi:

print "a[wh]: ", a[wh]
print "a[gt]  ", a[gt]
print "a[x]:  ", a[x]

memberi:

a[wh]:  [8 9]
a[gt]   [8 9]
a[x]:   [8 9]
uh oh
sumber