วิธีลบแถวทั้งหมดใน numpy.ndarray ที่มีค่าที่ไม่ใช่ตัวเลข


95

โดยพื้นฐานแล้วฉันกำลังทำการวิเคราะห์ข้อมูล ฉันอ่านในชุดข้อมูลเป็น numpy.ndarray และค่าบางส่วนหายไป (ไม่ว่าจะอยู่ที่นั่นเป็นอยู่NaNหรือเป็นสตริงที่เขียนว่าNA"")

ฉันต้องการล้างแถวทั้งหมดที่มีรายการแบบนี้ ฉันจะทำสิ่งนั้นด้วย numpy ndarray ได้อย่างไร?

คำตอบ:


164
>>> a = np.array([[1,2,3], [4,5,np.nan], [7,8,9]])
array([[  1.,   2.,   3.],
       [  4.,   5.,  nan],
       [  7.,   8.,   9.]])

>>> a[~np.isnan(a).any(axis=1)]
array([[ 1.,  2.,  3.],
       [ 7.,  8.,  9.]])

aและมอบหมายนี้

คำอธิบาย: np.isnan(a)ส่งกลับอาร์เรย์ที่คล้ายกันกับTrueที่NaN, Falseอื่น ๆ .any(axis=1)ลดm*nอาร์เรย์nด้วยการorดำเนินการเชิงตรรกะกับทั้งแถว~สลับTrue/Falseและa[ ]เลือกเฉพาะแถวจากอาร์เรย์เดิมซึ่งมีTrueอยู่ในวงเล็บ


11
np.isfiniteยังมีประโยชน์ในกรณีนี้เช่นเดียวกับเมื่อคุณต้องการกำจัด±Infค่า ไม่จำเป็นต้องใช้~เนื่องจากจะส่งคืนจริงเฉพาะสำหรับจำนวนจริงที่ จำกัด เท่านั้น
naught101

7
@ naught101 คุณต้องเปลี่ยนanyเป็นall. เนื่องจากคุณต้องการเลือกแถวที่ "all are finite" แทนที่จะเลือกแถวที่ "not any are nan"
AnnanFay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.