numpy.where () chi tiết, giải thích từng bước / ví dụ [đã đóng]


168

Tôi gặp khó khăn trong việc hiểu đúng numpy.where()mặc dù đọc tài liệu , bài nàybài khác .

Ai đó có thể cung cấp các ví dụ nhận xét từng bước với mảng 1D và 2D không?

Câu trả lời:


271

Sau khi loay hoay một lúc, tôi phát hiện ra mọi chuyện, và đang đăng chúng lên đây với hy vọng nó sẽ giúp được người khác.

Theo trực giác, np.wheregiống như hỏi " cho tôi biết nơi nào trong mảng này, các mục thỏa mãn một điều kiện nhất định ".

>>> 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

Nó cũng có thể được sử dụng để có được các mục trong mảng thỏa mãn điều kiện:

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

Khi alà mảng 2d, np.where()trả về một mảng của idx's row và một mảng col idx's:

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

Như trong trường hợp 1d, chúng ta có thể sử dụng np.where()để nhận các mục trong mảng 2d thỏa mãn điều kiện:

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

mảng ([9])


Lưu ý, khi alà 1d, np.where()vẫn trả về một mảng của idx's row và một mảng của col idx's, nhưng các cột có độ dài 1, do đó, sau đó là mảng trống.


10
Tôi đã vật lộn để hiểu np.where khi được sử dụng trên 2d cho đến khi tôi tìm thấy câu trả lời của bạn "Khi a là mảng 2d, np.where () trả về một mảng của hàng idx's và một mảng của col idx's:". Cảm ơn vì điều đó.
bencampbell_14

1
Tôi đã cảm thấy khá ngu ngốc sau khi đọc tài liệu ba lần và vẫn không giải được câu đố np.where(2d_array), cảm ơn vì đã làm sáng tỏ điều này! Bạn nên chấp nhận câu trả lời của riêng bạn. e: Ồ, nó đã đóng cửa. Chà, không nên
smcs

5
Thật xấu hổ vì điều này đã bị đóng cửa. Tuy nhiên tôi muốn thêm một tính năng khác np.wherecho câu trả lời đầy đủ này. Hàm cũng có thể chọn các phần tử từ mảng x và y tùy thuộc vào điều kiện. Không gian hạn chế trong bình luận này nhưng xem: 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]]))sẽ trở lại array([[4, 8, 6], [9, 2, 1]]). Lưu ý các yếu tố nào của x và y được chọn tùy thuộc vào Đúng / Sai
piccolo

Giải thích được đưa ra trong câu trả lời này chỉ là một trường hợp đặc biệt của np.where. Theo tài liệu, Khi chỉ conditionđược cung cấp, chức năng này là một tốc ký cho np.asarray(condition).nonzero().
Lenny

19

Ở đây vui hơn một chút. Tôi đã thấy rằng NumPy rất thường xuyên làm chính xác những gì tôi muốn nó sẽ làm - đôi khi tôi chỉ muốn thử mọi thứ nhanh hơn là đọc tài liệu. Trên thực tế một hỗn hợp của cả hai là tốt nhất.

Tôi nghĩ rằng câu trả lời của bạn là tốt (và chấp nhận nó nếu bạn muốn). Đây chỉ là "thêm".

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

cho:

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

... nhưng:

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

cho:

a[wh]:  [8 9]
a[gt]   [8 9]
a[x]:   [8 9]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.