मैं यह जानना चाहता हूं कि मेरे सरणी से नैन मूल्यों को कैसे हटाया जाए। मेरी सरणी कुछ इस तरह दिखती है:
x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration
मैं nan
मूल्यों को कैसे हटा सकता हूं x
?
मैं यह जानना चाहता हूं कि मेरे सरणी से नैन मूल्यों को कैसे हटाया जाए। मेरी सरणी कुछ इस तरह दिखती है:
x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration
मैं nan
मूल्यों को कैसे हटा सकता हूं x
?
जवाबों:
यदि आप अपने सरणियों के लिए numpy का उपयोग कर रहे हैं, तो आप भी उपयोग कर सकते हैं
x = x[numpy.logical_not(numpy.isnan(x))]
इसके तुल्य
x = x[~numpy.isnan(x)]
[जोड़ा आशुलिपि के लिए chbrown के लिए धन्यवाद]
व्याख्या
आंतरिक फ़ंक्शन, numpy.isnan
एक बूलियन / तार्किक सरणी देता है जिसका मूल्य True
हर जगह होता x
है जो संख्या नहीं है। हम विपरीत चाहते रूप में, हम तार्किक-नहीं ऑपरेटर का उपयोग, ~
के साथ एक सरणी प्राप्त करने के लिए True
हर जगह है कि रों x
है एक वैध संख्या।
अंत में, हम इस तार्किक सरणी को मूल सरणी में अनुक्रमित करने के लिए उपयोग करते हैं x
, केवल गैर-NaN मान प्राप्त करने के लिए।
x = x[numpy.isfinite(x)]
x = x[~numpy.isnan(x)]
, जो कि म्यूटाज़ट्रॉन के मूल उत्तर के बराबर है, लेकिन छोटा है। यदि आप अपने शिशुओं को चारों ओर रखना चाहते हैं, तो यह जान लें कि numpy.isfinite(numpy.inf) == False
, लेकिन ~numpy.isnan(numpy.inf) == True
।
np.where(np.isfinite(x), x, 0)
x
एक संख्यात्मक सरणी नहीं है। यदि आप तार्किक अनुक्रमण का उपयोग करना चाहते हैं, तो यह एक सरणी होना चाहिए - उदाहरण के लिएx = np.array(x)
filter(lambda v: v==v, x)
केवल vN के लिए v! = v के बाद से सूचियों और संख्या दोनों के लिए कार्य करता है
x
एक बार निर्दिष्ट करने की आवश्यकता है क्योंकि यह समाधान के प्रकार के विपरीत है x[~numpy.isnan(x)]
। यह सुविधाजनक है जब x
एक लंबी अभिव्यक्ति द्वारा परिभाषित किया गया है और आप इस लंबी अभिव्यक्ति के परिणाम को संग्रहीत करने के लिए एक अस्थायी चर बनाकर कोड को अव्यवस्थित नहीं करना चाहते हैं।
इसे इस्तेमाल करे:
import math
print [value for value in x if not math.isnan(value)]
अधिक के लिए, सूची समझ पर पढ़ें ।
print ([value for value in x if not math.isnan(value)])
np
पैकेज के साथ इस सूची को समझने के उत्तर का उपयोग कर सकते हैं : इसलिए बिना [value for value in x if not np.isnan(value)]
मेरे लिए @jmetz द्वारा जवाब काम नहीं किया, हालांकि पांडा इस्नाल () का उपयोग किया।
x = x[~pd.isnull(x)]
उपरोक्त कार्य करना:
x = x[~numpy.isnan(x)]
या
x = x[numpy.logical_not(numpy.isnan(x))]
मैंने पाया कि एक ही चर (x) पर रीसेट करने से वास्तविक नैनो मान नहीं हटते हैं और एक अलग चर का उपयोग करना पड़ता है। इसे एक अलग चर में स्थापित करने से नैन्स को हटा दिया गया। जैसे
y = x[~numpy.isnan(x)]
जैसा कि दूसरों द्वारा दिखाया गया है
x[~numpy.isnan(x)]
काम करता है। लेकिन यह एक त्रुटि फेंक देगा यदि सुन्न dtype एक मूल डेटा प्रकार नहीं है, उदाहरण के लिए यदि यह ऑब्जेक्ट है। उस स्थिति में आप पांडा का उपयोग कर सकते हैं।
x[~pandas.isna(x)] or x[~pandas.isnull(x)]
स्वीकार किए जाते हैं जवाब 2 डी सरणियों के लिए आकार बदल जाता है। मैं पंडों की बूंद () कार्यक्षमता का उपयोग करते हुए यहां एक समाधान प्रस्तुत करता हूं । यह 1D और 2D एरेज़ के लिए काम करता है। 2 डी मामले में आप के लिए मौसम का चयन कर सकते पंक्ति या स्तंभ ड्रॉप युक्त np.nan
।
import pandas as pd
import numpy as np
def dropna(arr, *args, **kwarg):
assert isinstance(arr, np.ndarray)
dropped=pd.DataFrame(arr).dropna(*args, **kwarg).values
if arr.ndim==1:
dropped=dropped.flatten()
return dropped
x = np.array([1400, 1500, 1600, np.nan, np.nan, np.nan ,1700])
y = np.array([[1400, 1500, 1600], [np.nan, 0, np.nan] ,[1700,1800,np.nan]] )
print('='*20+' 1D Case: ' +'='*20+'\nInput:\n',x,sep='')
print('\ndropna:\n',dropna(x),sep='')
print('\n\n'+'='*20+' 2D Case: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna (rows):\n',dropna(y),sep='')
print('\ndropna (columns):\n',dropna(y,axis=1),sep='')
print('\n\n'+'='*20+' x[np.logical_not(np.isnan(x))] for 2D: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna:\n',x[np.logical_not(np.isnan(x))],sep='')
परिणाम:
==================== 1D Case: ====================
Input:
[1400. 1500. 1600. nan nan nan 1700.]
dropna:
[1400. 1500. 1600. 1700.]
==================== 2D Case: ====================
Input:
[[1400. 1500. 1600.]
[ nan 0. nan]
[1700. 1800. nan]]
dropna (rows):
[[1400. 1500. 1600.]]
dropna (columns):
[[1500.]
[ 0.]
[1800.]]
==================== x[np.logical_not(np.isnan(x))] for 2D: ====================
Input:
[[1400. 1500. 1600.]
[ nan 0. nan]
[1700. 1800. nan]]
dropna:
[1400. 1500. 1600. 1700.]
सबसे सरल तरीका है:
numpy.nan_to_num(x)
प्रलेखन: https://docs.scipy.org/doc/numpy/reference/generated/numpy.nan_to_num.html
NaN
एक बड़ी संख्या के साथ प्रतिस्थापित करता है , जबकि ओपी ने तत्वों को पूरी तरह से हटाने के लिए कहा।
इस फिल्टर करने के लिए अपने दृष्टिकोण है ndarray , "एक्स" Nans और infs के लिए
मैं बिना किसी NaN
और के बिना पंक्तियों का एक नक्शा बनाता हूं inf
:
idx = np.where((np.isnan(X)==False) & (np.isinf(X)==False))
idx एक tuple है। यह दूसरे स्तंभ ( idx[1]
) सरणी, जहां कोई के सूचकांकों में शामिल है NaN है और न ही inf जहां पंक्ति में मिल गया।
फिर:
filtered_X = X[idx[1]]
filtered_X
एक्स के बिना होता है NaN
और न ही inf
।
@ jmetz का जवाब शायद सबसे ज्यादा लोगों की जरूरत है; हालाँकि, यह एक आयामी आयाम देता है, उदाहरण के लिए यह मेट्रिसेस में संपूर्ण पंक्तियों या स्तंभों को हटाने के लिए अनुपयोगी बनाता है।
ऐसा करने के लिए, किसी को तार्किक आयाम को एक आयाम में कम करना चाहिए, फिर लक्ष्य सरणी को अनुक्रमित करना चाहिए। उदाहरण के लिए, निम्नलिखित उन पंक्तियों को हटा देगा जिनमें कम से कम एक NaN मान हो:
x = x[~numpy.isnan(x).any(axis=1)]
अधिक विवरण यहाँ देखें ।