memeriksa nan dalam array numpy 2d

Saya sedang mengerjakan sepotong kecil kode yang dimulai dengan permukaan interpolasi yang saya buat sebelumnya. Interpolasi mengisi celah di permukaan dengan nan. Bagian dari pemrosesan saya melibatkan melihat jendela lokal di sekitar titik tertentu, dan menghitung beberapa ukuran menggunakan permukaan lokal. Idealnya saya ingin kode ini hanya dapat melakukan perhitungan apa pun jika seluruh permukaan lokal tidak mengandung nilai nan. Kode melakukan iterasi melalui permukaan besar asli dan memeriksa apakah jendela lokal tentang suatu titik memiliki nan.

Saya tahu ini bukan cara yang paling efisien untuk melakukannya, efisiensi waktu bukanlah sesuatu yang harus saya khawatirkan.

Inilah yang saya miliki sejauh ini:

for in in range(startz,endx):
    imin = i - half_tile
    imax = i + half_tile +1   

    for j in range(starty,endy):
        jmin = i - half_tile
        jmax = i + half_tile +1 

        #Test the local surface for nan's
        z = surface[imin:imax,jmin:jmax]
        Test = np.isnan(sum(z))

        #conditional statement
        if Test:
            print 'We have a nan'
            #set measures I want to calculate to zero

        else:
            print 'We  have a complete window'
            #do a set of calculations

variabel surface adalah permukaan interpolasi yang saya buat awalnya. Variabel half_tile hanya menentukan ukuran jendela lokal yang ingin saya gunakan. startx,endx,starty,endy menentukan ukuran permukaan asli yang akan dilalui.

Masalah yang saya alami adalah pernyataan kondisional saya sepertinya tidak berfungsi. Ini akan memberi tahu saya bahwa jendela lokal yang saya evaluasi tidak memiliki nan di dalamnya, tetapi kode saya yang lain (yang tidak saya tunjukkan di sini) tidak akan berfungsi karena dikatakan ada nan di dalam array.

Contohnya mungkin:

 [[ 7.07494104  7.04592032  7.01689961  6.98787889  6.95885817  6.92983745
  6.90081674  6.87179602  6.8427753   6.81375458  6.78473387  6.75571315
  6.72669243]
 [ 7.10077447  7.07175376  7.04273304  7.01371232  6.98469161  6.95567089
 6.92665017  6.89762945  6.86860874  6.83958802  6.8105673   6.78154658
 6.75252587]
 [ 7.12660791  7.09758719  7.06856647  7.03954576  7.01052504  6.98150432
 6.9524836   6.92346289  6.89444217  6.86542145  6.83640073  6.80738002
  6.7783593 ]
  [ 7.15244134  7.12342063  7.09439991  7.06537919  7.03635847  7.00733776
 6.97831704  6.94929632  6.9202148   6.89105825  6.86190169  6.83274514
 6.80358859]
 [ 7.17804068  7.14888413  7.11972758  7.09057103  7.06141448  7.03225793
  7.00310137  6.97394482  6.94478827  6.91563172  6.88647517  6.85731862
      nan]]

Berikut adalah contoh jendela lokal yang dievaluasi oleh kode saya. Dalam kode saya ini akan menjadi z. Seluruh array memiliki nilai bagus kecuali nilai terakhir yaitu nan.

Fungsi "memeriksa" dalam kode saya tidak mengetahui bahwa ada nan di dalam array. Pernyataan kondisional mengembalikan false padahal seharusnya true untuk menunjukkan bahwa ada hadiah nan. Saya kehilangan sesuatu yang mendasar dalam cara saya memeriksa array? atau apakah metodeku salah total?


person Andrew Dennison    schedule 22.03.2017    source sumber
comment
Saya perhatikan tidak ada np di sum. Anda mungkin menggunakan sum bawaan, yang berperilaku berbeda dari numpy.sum.   -  person user2357112 supports Monica    schedule 22.03.2017
comment
Ya, kamu pikir kamu mau np.isnan(z).sum()   -  person juanpa.arrivillaga    schedule 23.03.2017
comment
@juanpa.arrivillaga: np.isnan(z).any() mungkin lebih tepat.   -  person user2357112 supports Monica    schedule 23.03.2017
comment
@ user2357112 Tentu.   -  person juanpa.arrivillaga    schedule 23.03.2017


Jawaban (1)


isnan() mengembalikan array dengan nilai benar atau salah untuk setiap elemen dalam array. Anda memerlukan np.any() selain isnan(). lihat contoh di bawah ini

import numpy as np
a = np.array([[1,2,3,4],[1,2,3,np.NaN]])
print np.isnan(a)
print np.any(np.isnan(a))

menghasilkan

[[False False False False]
 [False False False  True]]
True
person plasmon360    schedule 22.03.2017