Tìm chỉ số của các phần tử bằng 0 trong mảng NumPy


144

NumPy có chức năng / phương thức hiệu quả nonzero()để xác định các chỉ số của các phần tử khác không trong một ndarrayđối tượng. Cách hiệu quả nhất để có được những chỉ số của các yếu tố đó là những gì làm có giá trị không?

Câu trả lời:


226

numpy.where () là sở thích của tôi.

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])
>>> numpy.where(x == 0)[0]
array([1, 3, 5])

16
Tôi đang cố nhớ Python. Tại sao where()trả lại một tuple? numpy.where(x == 0)[1]nằm ngoài giới hạn mảng chỉ số được kết hợp với sau đó là gì?
Zhubarb

@Zhubarb - Hầu hết việc sử dụng phân là tuples - np.zeros((3,))để tạo ra một vectơ dài 3 chẳng hạn. Tôi nghi ngờ điều này là để làm cho phân tích cú pháp dễ dàng. Nếu không, một cái gì đó như np.zeros(3,0,dtype='int16')so với np.zeros(3,3,3,dtype='int16')sẽ gây khó chịu để thực hiện.
mtrw

5
Không. wheretrả về một tuple ndarray, mỗi cái tương ứng với một thứ nguyên của đầu vào. trong trường hợp này đầu vào là một mảng, vì vậy đầu ra là a 1-tuple. Nếu x là một ma trận, nó sẽ là một 2-tuple, v.v.
Ciprian Tomoiagă

1
Kể từ numpy 1.16, tài liệu dànhnumpy.where riêng cho khuyến nghị sử dụng numpy.nonzerotrực tiếp thay vì gọi wherechỉ với một đối số.
jirassimok

@jirassimok làm thế nào để bạn sử dụng nonzero để tìm số không như câu hỏi?
mLstudent33

28

np.argwhere,

import numpy as np
arr = np.array([[1,2,3], [0, 1, 0], [7, 0, 2]])
np.argwhere(arr == 0)

trong đó trả về tất cả các chỉ mục tìm thấy dưới dạng hàng:

array([[1, 0],    # Indices of the first zero
       [1, 2],    # Indices of the second zero
       [2, 1]],   # Indices of the third zero
      dtype=int64)

23

Bạn có thể tìm kiếm bất kỳ điều kiện vô hướng với:

>>> a = np.asarray([0,1,2,3,4])
>>> a == 0 # or whatver
array([ True, False, False, False, False], dtype=bool)

Điều này sẽ trả lại mảng như một mặt nạ boolean của điều kiện.


1
Bạn có thể sử dụng điều này để truy cập các yếu tố số 0:a[a==0] = epsilon
Quant Metropolis

17

Bạn cũng có thể sử dụng nonzero()bằng cách sử dụng nó trên mặt nạ boolean của điều kiện, bởi vì Falseđây cũng là một loại số không.

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])

>>> x==0
array([False, True, False, True, False, True, False, False, False, False, False], dtype=bool)

>>> numpy.nonzero(x==0)[0]
array([1, 3, 5])

Nó hoạt động giống hệt như mtrwcách của họ, nhưng nó liên quan nhiều hơn đến câu hỏi;)


Đây phải là câu trả lời được chấp nhận vì đây là khuyến cáo sử dụng nonzerophương pháp để kiểm tra điều kiện.
ngụy biện

5

Bạn có thể sử dụng numpy.nonzero để tìm số không.

>>> import numpy as np
>>> x = np.array([1,0,2,0,3,0,0,4,0,5,0,6]).reshape(4, 3)
>>> np.nonzero(x==0)  # this is what you want
(array([0, 1, 1, 2, 2, 3]), array([1, 0, 2, 0, 2, 1]))
>>> np.nonzero(x)
(array([0, 0, 1, 2, 3, 3]), array([0, 2, 1, 1, 0, 2]))

4

Nếu bạn đang làm việc với một mảng một chiều, có một cú pháp cú pháp:

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])
>>> numpy.flatnonzero(x == 0)
array([1, 3, 5])

Điều này hoạt động tốt miễn là tôi chỉ có một điều kiện. Nếu tôi muốn tìm kiếm "x == numpy.array (0,2,7)" thì sao? Kết quả phải là mảng ([1,2,3,5,9]). Nhưng làm thế nào tôi có thể có được điều này?
MoTSCHIGGE

Bạn có thể làm điều này với:numpy.flatnonzero(numpy.logical_or(numpy.logical_or(x==0, x==2), x==7))
Dusch

1
import numpy as np

x = np.array([1,0,2,3,6])
non_zero_arr = np.extract(x>0,x)

min_index = np.amin(non_zero_arr)
min_value = np.argmin(non_zero_arr)

1

Tôi sẽ làm theo cách sau:

>>> x = np.array([[1,0,0], [0,2,0], [1,1,0]])
>>> x
array([[1, 0, 0],
       [0, 2, 0],
       [1, 1, 0]])
>>> np.nonzero(x)
(array([0, 1, 2, 2]), array([0, 1, 0, 1]))

# if you want it in coordinates
>>> x[np.nonzero(x)]
array([1, 2, 1, 1])
>>> np.transpose(np.nonzero(x))
array([[0, 0],
       [1, 1],
       [2, 0],
       [2, 1])
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.