আমি আমার অ্যারে থেকে ন্যান মানগুলি কীভাবে সরিয়ে ফেলব তা নির্ধারণ করতে চাই। আমার অ্যারে দেখতে এমন কিছু দেখাচ্ছে:
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?
উত্তর:
আপনি যদি আপনার অ্যারেগুলির জন্য অদ্ভুত ব্যবহার করছেন তবে আপনি এটি ব্যবহার করতে পারেন
x = x[numpy.logical_not(numpy.isnan(x))]
সমতুল্যভাবে
x = x[~numpy.isnan(x)]
[সংযুক্ত শর্টহ্যান্ডের জন্য চিব্রাউনকে ধন্যবাদ]
ব্যাখ্যা
ভেতরের ফাংশন, numpy.isnanএকটি বুলিয়ান / লজিক্যাল অ্যারে যা মান আছে ফেরৎ Trueসর্বত্র যে xনা-এ-সংখ্যা। আমরা বিপরীত চান হিসাবে, আমরা যৌক্তিক নয় অপারেটর ব্যবহার করেন, ~সহ একটি বিন্যাস পেতে Trueসর্বত্র যে গণ x হয় একটি বৈধ সংখ্যা।
অবশেষে আমরা এই লজিক্যাল অ্যারেটি মূল অ্যারেতে সূচি হিসাবে ব্যবহার করি x, কেবল নন-এনএন মানগুলি পুনরুদ্ধার করতে।
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)
v! = v কেবল NaN এর জন্য তালিকা এবং অকার্যকর অ্যারে উভয়ের জন্যই কাজ করে
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))]
আমি দেখতে পেয়েছি যে একই ভেরিয়েবল (এক্স) এ পুনরায় সেট করা প্রকৃত ন্যান মানগুলি সরিয়ে দেয় না এবং আলাদা ভেরিয়েবল ব্যবহার করতে হয়েছিল। এটি একটি ভিন্ন ভেরিয়েবলে সেট করা ন্যানগুলি মুছে ফেলে। যেমন
y = x[~numpy.isnan(x)]
xনতুন মান (অর্থাত্ এনএএনগুলি ব্যতীত ...) দিয়ে অতিরিক্ত লেখা হবে should । কেন এমনটি হতে পারে সে সম্পর্কে আপনি আরও কোনও তথ্য সরবরাহ করতে পারেন?
যেমনটি অন্যরা দেখিয়েছে
x[~numpy.isnan(x)]
কাজ করে। তবে এটি একটি ত্রুটি ছুঁড়ে দেবে যদি নমপি টাইপ কোনও দেশীয় ডেটা টাইপ না হয়, উদাহরণস্বরূপ যদি এটি বস্তু হয় is সেক্ষেত্রে আপনি পান্ডা ব্যবহার করতে পারেন।
x[~pandas.isna(x)] or x[~pandas.isnull(x)]
গৃহীত উত্তর 2d অ্যারে জন্য আকৃতি পরিবর্তন। পান্ডাস ড্রপনা () কার্যকারিতাটি ব্যবহার করে আমি এখানে একটি সমাধান উপস্থাপন করছি । এটি 1D এবং 2D অ্যারেগুলির জন্য কাজ করে। 2D যদি আপনি আবহাওয়া নির্বাচন করতে পারবেন সারি বা কলাম ড্রপ ধারণকারী 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/references/generated/numpy.nan_to_num.html
NaNএকটি বৃহত সংখ্যক সাথে বিকল্পযুক্ত করে, যখন ওপি উপাদানগুলির সম্পূর্ণরূপে অপসারণ করতে বলেছিল।
এটি NaNs এবং infs- এর জন্য নাদার্রে "এক্স" ফিল্টার করার জন্য আমার পন্থা ,
আমি নীচে কোনও NaNএবং কোনও ছাড়াই সারিগুলির মানচিত্র তৈরি করেছি inf:
idx = np.where((np.isnan(X)==False) & (np.isinf(X)==False))
আইডিএক্স একটি টিপল। এটির দ্বিতীয় কলামে ( idx[1]অ্যারে) সূচকগুলি রয়েছে, যেখানে কোনও এনএএন বা ইনফ নেই যেখানে সারি জুড়ে পাওয়া যায় না।
তারপর:
filtered_X = X[idx[1]]
filtered_Xএক্স রয়েছে ছাড়া NaN কিংবা inf।
@ জেমেটজের উত্তর সম্ভবত সবচেয়ে বেশি লোকের প্রয়োজন; তবে এটি এক-মাত্রিক অ্যারে উত্পাদন করে, যেমন ম্যাট্রিকগুলিতে পুরো সারি বা কলামগুলি অপসারণ করতে অকেজো করে তোলে।
এটি করার জন্য, একটিকে লজিক্যাল অ্যারেটিকে একটি মাত্রায় কমিয়ে আনা উচিত, তারপরে লক্ষ্য অ্যারের সূচক তৈরি করতে হবে। উদাহরণস্বরূপ, নিম্নলিখিতগুলি কমপক্ষে একটি এনএএন মানযুক্ত সারিগুলি সরিয়ে ফেলবে:
x = x[~numpy.isnan(x).any(axis=1)]
এখানে আরও বিস্তারিত দেখুন ।