Temukan indeks elemen yang sama dengan nol dalam array NumPy

144

NumPy memiliki fungsi / metode yang efisien nonzero()untuk mengidentifikasi indeks elemen yang tidak nol dalam suatu ndarrayobjek. Apa cara yang paling efisien untuk mendapatkan indeks dari elemen yang melakukan memiliki nilai nol?

Gotgenes
sumber

Jawaban:

226

numpy.where () adalah favorit saya.

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])
>>> numpy.where(x == 0)[0]
array([1, 3, 5])
mtrw
sumber
16
Saya mencoba mengingat Python. Mengapa where()mengembalikan tuple? numpy.where(x == 0)[1]di luar batas. apa array indeks digabungkan untuk itu?
Zhubarb
@ Zhubarb - Sebagian besar penggunaan indeces adalah tuple - np.zeros((3,))untuk membuat vektor 3-panjang misalnya. Saya menduga ini untuk membuat parsing params mudah. Kalau tidak, sesuatu seperti np.zeros(3,0,dtype='int16')versus np.zeros(3,3,3,dtype='int16')akan mengganggu untuk diterapkan.
mtrw
5
tidak. wheremengembalikan tupel ndarrays, masing-masing sesuai dengan dimensi input. dalam hal ini inputnya adalah array, jadi outputnya adalah a 1-tuple. Jika x adalah sebuah matriks, itu akan menjadi 2-tuple, dan seterusnya
Ciprian Tomoiag
1
Pada numpy 1,16, dokumentasi untuknumpy.where secara khusus merekomendasikan penggunaan numpy.nonzerolangsung daripada menelepon wherehanya dengan satu argumen.
jirassimok
@ jirassimok bagaimana Anda menggunakan bukan nol untuk menemukan nol saat pertanyaan diajukan?
mLstudent33
28

Ada np.argwhere,

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

yang mengembalikan semua indeks yang ditemukan sebagai baris:

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

Anda dapat mencari kondisi skalar apa pun dengan:

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

Yang akan mengembalikan array sebagai topeng kondisi boolean.

nate c
sumber
1
Anda dapat menggunakan ini untuk mengakses elemen nol:a[a==0] = epsilon
Quant Metropolis
17

Anda juga dapat menggunakannya nonzero()dengan menggunakannya pada topeng kondisi boolean, karena Falsejuga semacam nol.

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

Ini melakukan persis sama seperti mtrwcara, tetapi lebih terkait dengan pertanyaan;)

Dusch
sumber
Ini harus menjadi jawaban yang diterima karena ini adalah metode yang disarankan nonzerountuk memeriksa kondisi.
sophros
5

Anda dapat menggunakan numpy.nonzero untuk menemukan nol.

>>> 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]))
chmnsk
sumber
4

Jika Anda bekerja dengan array satu dimensi ada gula sintaksis:

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])
>>> numpy.flatnonzero(x == 0)
array([1, 3, 5])
dvdvck
sumber
Ini berfungsi dengan baik selama saya hanya memiliki satu syarat. Bagaimana jika saya ingin mencari "x == numpy.array (0,2,7)"? Hasilnya harus berupa array ([1,2,3,5,9]). Tetapi bagaimana saya bisa mendapatkan ini?
MoTSCHIGGE
Anda bisa melakukan ini dengan: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)
sramij
sumber
1

Saya akan melakukannya dengan cara berikut:

>>> 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])
Jeril
sumber