একটি অ্যারের থেকে ন্যান মানগুলি সরানো হচ্ছে


221

আমি আমার অ্যারে থেকে ন্যান মানগুলি কীভাবে সরিয়ে ফেলব তা নির্ধারণ করতে চাই। আমার অ্যারে দেখতে এমন কিছু দেখাচ্ছে:

x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration

আমি কীভাবে nanমানগুলি সরিয়ে ফেলব x?


পরিষ্কার হওয়ার জন্য, "NaNs সরান" দ্বারা আপনি বোঝাচ্ছেন কেবল নন-নাল মানগুলির সাবসেট ফিল্টার করে । "কিছু কিছু মান (শূন্য, ধ্রুবক, গড়, মধ্যম ইত্যাদি) দিয়ে
এনএএনগুলি পূরণ করবেন না

উত্তর:


360

আপনি যদি আপনার অ্যারেগুলির জন্য অদ্ভুত ব্যবহার করছেন তবে আপনি এটি ব্যবহার করতে পারেন

x = x[numpy.logical_not(numpy.isnan(x))]

সমতুল্যভাবে

x = x[~numpy.isnan(x)]

[সংযুক্ত শর্টহ্যান্ডের জন্য চিব্রাউনকে ধন্যবাদ]

ব্যাখ্যা

ভেতরের ফাংশন, numpy.isnanএকটি বুলিয়ান / লজিক্যাল অ্যারে যা মান আছে ফেরৎ Trueসর্বত্র যে xনা-এ-সংখ্যা। আমরা বিপরীত চান হিসাবে, আমরা যৌক্তিক নয় অপারেটর ব্যবহার করেন, ~সহ একটি বিন্যাস পেতে Trueসর্বত্র যে গণ x হয় একটি বৈধ সংখ্যা।

অবশেষে আমরা এই লজিক্যাল অ্যারেটি মূল অ্যারেতে সূচি হিসাবে ব্যবহার করি x, কেবল নন-এনএন মানগুলি পুনরুদ্ধার করতে।


31
বাx = x[numpy.isfinite(x)]
অলস 1

14
বা x = x[~numpy.isnan(x)], যা মুটজম্যাট্রনের মূল উত্তরের সমতুল্য তবে সংক্ষিপ্ত। যদি আপনি চারপাশে আপনার অসীমতার রাখা, যে জানতে চাই numpy.isfinite(numpy.inf) == Falseঅবশ্যই, কিন্তু ~numpy.isnan(numpy.inf) == True
chbrown

7
লোকেরা এটি নাদারের সাহায্যে সমাধান করতে এবং মাত্রা বজায় রাখার জন্য অদ্ভুত যেখানে ব্যবহার করুন :np.where(np.isfinite(x), x, 0)
বোল্টজম্যান


1
@ টাউরি: এটি হচ্ছেন কারণ আপনার ইনপুটটি xকোনও শূন্য অ্যারে নয়। আপনি যদি লজিকাল ইনডেক্সিং ব্যবহার করতে চান তবে এটি অবশ্যই একটি অ্যারে হতে হবে - যেমনx = np.array(x)
জেমেটজ

50
filter(lambda v: v==v, x)

v! = v কেবল NaN এর জন্য তালিকা এবং অকার্যকর অ্যারে উভয়ের জন্যই কাজ করে


5
আপনি যখন স্ট্রিং এবং ন্যানের মতো মিশ্র প্রকারের মিশ্রিত প্রকারের বস্তুগুলির একটি অ্যারে থেকে নানগুলি ফিল্টার করছেন এমন ক্ষেত্রে হ্যাক তবে একটি বিশেষ উপকারী।
অস্টিন রিচার্ডসন

খুব পরিষ্কার সমাধান।
মুন্দ্রা

2
এটি বুদ্ধিমান বলে মনে হতে পারে তবে যুক্তি এবং তাত্ত্বিকভাবে অন্যান্য অবজেক্টগুলিকে (যেমন কাস্টম ক্লাসগুলি) এও এই সম্পত্তি থাকতে পারে
Chris_Rands

এছাড়াও দরকারী কারণ এটি কেবলমাত্র xধরণের সমাধানগুলির বিপরীতে একবার নির্দিষ্ট করা দরকার x[~numpy.isnan(x)]xএকটি দীর্ঘ এক্সপ্রেশন দ্বারা সংজ্ঞায়িত করা হলে এটি সুবিধাজনক এবং আপনি এই দীর্ঘ অভিব্যক্তির ফলাফল সংরক্ষণের জন্য একটি অস্থায়ী পরিবর্তনশীল তৈরি করে কোডটিকে বিশৃঙ্খলা করতে চান না।
খ্রিস্টান ও'রিলি

34

এটা চেষ্টা কর:

import math
print [value for value in x if not math.isnan(value)]

আরও তথ্যের জন্য, তালিকা সমঝোতার উপর পড়ুন ।


5
আপনি যদি উত্তরটি উত্তরহীন এবং @ lazy1 দ্বারা প্রায় উপলব্ধ তালিকার বোঝার চেয়ে তাত্পর্যপূর্ণ ক্রম হিসাবে ব্যবহার করেন তবে - অলসতার সমাধানটি কিছুটা দ্রুত (যদিও প্রযুক্তিগতভাবে কোনও অনন্ত মানেরও ফিরে আসবে না)।
jmetz

বন্ধনীগুলি ভুলে যাবেন না :)print ([value for value in x if not math.isnan(value)])
হাইপার

আপনি যদি শীর্ষ উত্তরের মতো নকল ব্যবহার করছেন তবে আপনি এই তালিকাটি বোঝার জন্য npপ্যাকেজটি ব্যবহার করতে পারেন : সুতরাং [value for value in x if not np.isnan(value)]
ন্যানগুলি


6

উপরের কাজ:

x = x[~numpy.isnan(x)]

অথবা

x = x[numpy.logical_not(numpy.isnan(x))]

আমি দেখতে পেয়েছি যে একই ভেরিয়েবল (এক্স) এ পুনরায় সেট করা প্রকৃত ন্যান মানগুলি সরিয়ে দেয় না এবং আলাদা ভেরিয়েবল ব্যবহার করতে হয়েছিল। এটি একটি ভিন্ন ভেরিয়েবলে সেট করা ন্যানগুলি মুছে ফেলে। যেমন

y = x[~numpy.isnan(x)]

এটা অদ্ভুত; দস্তাবেজ অনুসারে , বুলিয়ান অ্যারে সূচক (যা এটি), উন্নত সূচকের অধীনে রয়েছে যা স্পষ্টত "সর্বদা ডেটার একটি অনুলিপি প্রদান করে", সুতরাং আপনার xনতুন মান (অর্থাত্ এনএএনগুলি ব্যতীত ...) দিয়ে অতিরিক্ত লেখা হবে should । কেন এমনটি হতে পারে সে সম্পর্কে আপনি আরও কোনও তথ্য সরবরাহ করতে পারেন?
jmetz

5

যেমনটি অন্যরা দেখিয়েছে

x[~numpy.isnan(x)]

কাজ করে। তবে এটি একটি ত্রুটি ছুঁড়ে দেবে যদি নমপি টাইপ কোনও দেশীয় ডেটা টাইপ না হয়, উদাহরণস্বরূপ যদি এটি বস্তু হয় is সেক্ষেত্রে আপনি পান্ডা ব্যবহার করতে পারেন।

x[~pandas.isna(x)] or x[~pandas.isnull(x)]

4

গৃহীত উত্তর 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.]

3

আপনি যদি ব্যবহার করছেন numpy

# first get the indices where the values are finite
ii = np.isfinite(x)

# second get the values
x = x[ii]

1

একটি সহজ উপায়:

numpy.nan_to_num(x)

ডকুমেন্টেশন: https://docs.scipy.org/doc/numpy/references/generated/numpy.nan_to_num.html


2
তাই আপনাকে স্বাগতম! আপনার প্রস্তাবিত সমাধান সমস্যার উত্তর দেয় না: আপনার সমাধানটি NaNএকটি বৃহত সংখ্যক সাথে বিকল্পযুক্ত করে, যখন ওপি উপাদানগুলির সম্পূর্ণরূপে অপসারণ করতে বলেছিল।
পিয়র পাওলো

0

এটি 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


0

@ জেমেটজের উত্তর সম্ভবত সবচেয়ে বেশি লোকের প্রয়োজন; তবে এটি এক-মাত্রিক অ্যারে উত্পাদন করে, যেমন ম্যাট্রিকগুলিতে পুরো সারি বা কলামগুলি অপসারণ করতে অকেজো করে তোলে।

এটি করার জন্য, একটিকে লজিক্যাল অ্যারেটিকে একটি মাত্রায় কমিয়ে আনা উচিত, তারপরে লক্ষ্য অ্যারের সূচক তৈরি করতে হবে। উদাহরণস্বরূপ, নিম্নলিখিতগুলি কমপক্ষে একটি এনএএন মানযুক্ত সারিগুলি সরিয়ে ফেলবে:

x = x[~numpy.isnan(x).any(axis=1)]

এখানে আরও বিস্তারিত দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.