Câu trả lời:
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])
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.
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.
numpy.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ố.
Có 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)
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.
a[a==0] = epsilon
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;)
nonzerophương pháp để kiểm tra điều kiện.
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]))
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])
numpy.flatnonzero(numpy.logical_or(numpy.logical_or(x==0, x==2), x==7))
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])
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ì?