กำลังตรวจสอบ nan ในอาร์เรย์ 2 มิติ

ฉันกำลังเขียนโค้ดชิ้นเล็กๆ ที่ขึ้นต้นด้วยพื้นผิวที่มีการสอดแทรกที่ฉันสร้างขึ้นก่อนหน้านี้ การประมาณค่าเติมเต็มช่องว่างบนพื้นผิวด้วยค่านาโน ส่วนหนึ่งของการประมวลผลของฉันเกี่ยวข้องกับการดูหน้าต่างท้องถิ่นรอบๆ จุดใดจุดหนึ่ง และการคำนวณการวัดบางอย่างโดยใช้พื้นผิวในพื้นที่ ตามหลักการแล้ว ฉันต้องการให้โค้ดนี้ เท่านั้น สามารถคำนวณใดๆ ได้ หากพื้นผิวในพื้นที่ทั้งหมดไม่มีค่า nan โค้ดจะวนซ้ำผ่านพื้นผิวขนาดใหญ่ดั้งเดิม และตรวจสอบเพื่อดูว่าหน้าต่างท้องถิ่นเกี่ยวกับจุดหนึ่งๆ มีนาโนหรือไม่

ฉันรู้ว่านี่ไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการทำสิ่งนี้ ความมีประสิทธิภาพด้านเวลาไม่ใช่สิ่งที่ฉันต้องกังวล

นี่คือสิ่งที่ฉันมี:

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

ตัวแปร surface คือพื้นผิวที่มีการสอดแทรกที่ฉันสร้างขึ้นตั้งแต่แรก ตัวแปร half_tile เป็นเพียงการกำหนดขนาดของหน้าต่างในเครื่องที่ฉันต้องการใช้ startx,endx,starty,endy กำลังกำหนดขนาดของพื้นผิวดั้งเดิมเพื่อวนซ้ำ

ที่ฉันประสบปัญหาคือคำสั่งแบบมีเงื่อนไขของฉันดูเหมือนจะไม่ทำงาน มันจะบอกฉันว่าหน้าต่างในเครื่องที่ฉันกำลังประเมินไม่มี nan อยู่ในนั้น แต่โค้ดที่เหลือของฉัน (ซึ่งฉันไม่ได้แสดงที่นี่) จะไม่ทำงานเพราะมันบอกว่ามี nan อยู่ในอาร์เรย์

ตัวอย่างนี้อาจเป็น:

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

นี่คือตัวอย่างของหน้าต่างในเครื่องที่โค้ดของฉันกำลังประเมิน ในรหัสของฉันนี่จะเป็น z อาร์เรย์ทั้งหมดมีค่าที่ดี ยกเว้นค่าสุดท้ายคือ nan

ฟังก์ชัน "การตรวจสอบ" ในโค้ดของฉันไม่รับว่ามีนาโนอยู่ในอาร์เรย์ คำสั่งแบบมีเงื่อนไขส่งคืน false เมื่อควรเป็น true เพื่อระบุว่ามี nan อยู่ ฉันขาดอะไรพื้นฐานไปในการตรวจสอบอาเรย์? หรือวิธีการของฉันผิดโดยสิ้นเชิง?


person Andrew Dennison    schedule 22.03.2017    source แหล่งที่มา
comment
ฉันสังเกตเห็นว่าไม่มี np บน sum คุณอาจใช้ sum ในตัวซึ่งมีพฤติกรรมแตกต่างจาก numpy.sum   -  person user2357112 supports Monica    schedule 22.03.2017
comment
ใช่ คิดว่าคุณต้องการ np.isnan(z).sum()   -  person juanpa.arrivillaga    schedule 23.03.2017
comment
@juanpa.arrivillaga: np.isnan(z).any() น่าจะเหมาะสมกว่า   -  person user2357112 supports Monica    schedule 23.03.2017
comment
@ user2357112 แน่นอน   -  person juanpa.arrivillaga    schedule 23.03.2017


คำตอบ (1)


isnan() ส่งคืนอาร์เรย์ที่มีค่าจริงหรือเท็จสำหรับแต่ละองค์ประกอบในอาร์เรย์ คุณต้องมี np.any() นอกเหนือจาก isnan() ดูตัวอย่างด้านล่าง

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

ผลลัพธ์ใน

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