नैनो मान को शून्य में बदलें


97

मेरे पास 2 डी अंक है। इस सरणी में कुछ मान हैं NaN। मैं इस ऐरे का उपयोग करके कुछ ऑपरेशन करना चाहता हूं। उदाहरण के लिए सरणी पर विचार करें:

[[   0.   43.   67.    0.   38.]
 [ 100.   86.   96.  100.   94.]
 [  76.   79.   83.   89.   56.]
 [  88.   NaN   67.   89.   81.]
 [  94.   79.   67.   89.   69.]
 [  88.   79.   58.   72.   63.]
 [  76.   79.   71.   67.   56.]
 [  71.   71.   NaN   56.  100.]]

मैं प्रत्येक पंक्ति को लेने की कोशिश कर रहा हूं, एक बार में, इसे पंक्ति से अधिकतम 3 मान प्राप्त करने के लिए उलटा क्रम में क्रमबद्ध करें और उनका औसत लें। कोड मैंने कोशिश की है:

# nparr is a 2D numpy array
for entry in nparr:
    sortedentry = sorted(entry, reverse=True)
    highest_3_values = sortedentry[:3]
    avg_highest_3 = float(sum(highest_3_values)) / 3

यह युक्त पंक्तियों के लिए काम नहीं करता है NaN। मेरा प्रश्न यह है कि क्या सभी NaNमानों को 2 डी शुन्य सरणी में शून्य में बदलने का एक त्वरित तरीका है ताकि मुझे छंटनी और अन्य चीजों से कोई समस्या न हो जो मैं करने की कोशिश कर रहा हूं।


1
each: map: return isNaN(value) ? 0 : value
kirilloid

@kirilloid: अच्छा लगता है, उदाहरण के उपयोग के बारे में कैसे?
सर्व-इन

जवाबों:


125

यह काम करना चाहिए:

from numpy import *

a = array([[1, 2, 3], [0, 3, NaN]])
where_are_NaNs = isnan(a)
a[where_are_NaNs] = 0

उपर्युक्त मामले में जहां____________ ’___३_३_s____ है:

In [12]: where_are_NaNs
Out[12]: 
array([[False, False, False],
       [False, False,  True]], dtype=bool)

141

Aआपका 2D सरणी कहां है:

import numpy as np
A[np.isnan(A)] = 0

फ़ंक्शन isnanएक बूल सरणी का उत्पादन करता है जो यह दर्शाता है कि NaNमान कहाँ हैं। एक बूलियन सरणी का उपयोग उसी आकृति के एक सरणी को अनुक्रमित करने के लिए किया जा सकता है। इसे मास्क की तरह समझें।


41

कैसे nan_to_num () के बारे में ?


11
nan_to_num () भी शिशुओं को बदलता है - यह कुछ मामलों में अवांछित हो सकता है।
अगोस

11
यह भी> 10x अन्य विधियों की तुलना में धीमा है।
user48956

7
मैं tat "> 10x slow" स्टेटमेंट के बारे में निश्चित नहीं था इसलिए मैंने जाँच की। दरअसल, यह इतना धीमा है। इस पर ध्यान दिलाने के लिए धन्यवाद।
गैब्रियल

16

आप यह np.whereजानने के लिए उपयोग कर सकते हैं कि आपके पास कहाँ है NaN:

import numpy as np

a = np.array([[   0,   43,   67,    0,   38],
              [ 100,   86,   96,  100,   94],
              [  76,   79,   83,   89,   56],
              [  88,   np.nan,   67,   89,   81],
              [  94,   79,   67,   89,   69],
              [  88,   79,   58,   72,   63],
              [  76,   79,   71,   67,   56],
              [  71,   71,   np.nan,   56,  100]])

b = np.where(np.isnan(a), 0, a)

In [20]: b
Out[20]: 
array([[   0.,   43.,   67.,    0.,   38.],
       [ 100.,   86.,   96.,  100.,   94.],
       [  76.,   79.,   83.,   89.,   56.],
       [  88.,    0.,   67.,   89.,   81.],
       [  94.,   79.,   67.,   89.,   69.],
       [  88.,   79.,   58.,   72.,   63.],
       [  76.,   79.,   71.,   67.,   56.],
       [  71.,   71.,    0.,   56.,  100.]])

1
जैसा कि यह है, यह काम नहीं करता है, आपको इसे बदलने की आवश्यकता np.where(np.isnan(a), a, 0)है np.where(~np.isnan(a), a, 0)। यह हालांकि उपयोग किए गए संस्करणों में अंतर हो सकता है।
तेहरिस

1
@TehTris तुम सही हो, धन्यवाद। मैंने इसे बदल दिया है b = np.where(np.isnan(a), 0, a)जो अधिक सीधा है फिर ~जैसा मैं सोचता हूं।
एंटोन प्रोतोपोपोव


3

आप numpy.nan_to_num का उपयोग कर सकते हैं :

numpy.nan_to_num (एक्स): बदलें नेन साथ शून्य और inf साथ परिमित संख्या

उदाहरण (देखें डॉक्टर):

>>> np.set_printoptions(precision=8)
>>> x = np.array([np.inf, -np.inf, np.nan, -128, 128])
>>> np.nan_to_num(x)
array([  1.79769313e+308,  -1.79769313e+308,   0.00000000e+000,
        -1.28000000e+002,   1.28000000e+002])

1

नान कभी भी नान के बराबर नहीं होता है

if z!=z:z=0

तो एक 2 डी सरणी के लिए

for entry in nparr:
    if entry!=entry:entry=0

यह काम नहीं करता है: entryएक 1D सरणी है, इसलिए परीक्षण entry != entryएक साधारण बूलियन नहीं देता है लेकिन उठाता है ValueError
एरिक ओ लेबिगॉट

-1

आप लंबदा फ़ंक्शन का उपयोग कर सकते हैं, 1D सरणी के लिए एक उदाहरण:

import numpy as np
a = [np.nan, 2, 3]
map(lambda v:0 if np.isnan(v) == True else v, a)

यह आपको परिणाम देगा:

[0, 2, 3]

-8

आपके उद्देश्यों के लिए, यदि सभी वस्तुओं को संग्रहीत किया जाता है strऔर आप केवल उपयोग किए गए अनुसार सॉर्ट करते हैं और फिर पहले तत्व की जांच करते हैं और इसे '0' से बदल देते हैं

>>> l1 = ['88','NaN','67','89','81']
>>> n = sorted(l1,reverse=True)
['NaN', '89', '88', '81', '67']
>>> import math
>>> if math.isnan(float(n[0])):
...     n[0] = '0'
... 
>>> n
['0', '89', '88', '81', '67']

6
क्या आपकी टिप्पणी थोड़ी कठोर नहीं है? मुझे पता है कि क्या सुन्न है, लेकिन क्या पता था कि सरणी संख्याओं का स्ट्रिंग प्रतिनिधित्व नहीं होगी। मैंने विशेष रूप से इसके लिए सुस्पष्ट दृष्टिकोण से नहीं लिया, लेकिन अजगर के दृष्टिकोण से, यदि यह उपयोगी था।
सेंथिल कुमारन

2
सरणी को री-ऑर्डर करने से यह हल करने का एक भ्रमित तरीका लगता है।
होलोग्राफिक

मुझे अपनी सरणी के क्रम को संरक्षित करने की आवश्यकता है। यदि आप अपने सरणी में एकाधिक 'NaN' रखते हैं तो यह काम नहीं करेगा।
3nrique0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.