ন্যান মানকে শূন্যে রূপান্তর করুন


95

আমার কাছে একটি 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। আমার প্রশ্ন হ'ল, NaN2 ডি নাম্পার অ্যারেতে সমস্ত মানগুলিকে শূন্যে রূপান্তর করার জন্য কী দ্রুত উপায় আছে যাতে আমার বাছাই করার চেষ্টা করা এবং অন্যান্য জিনিসগুলি সাজানোর ক্ষেত্রে আমার কোনও সমস্যা না হয়।


4
each: map: return isNaN(value) ? 0 : value
কিরিলয়েড

@ কিরিলয়েড: ভাল লাগছে, উদাহরণ ব্যবহারের ক্ষেত্রে কীভাবে?
সার্ভ-ইন

উত্তর:


123

এই কাজ করা উচিত:

from numpy import *

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

উপরের ক্ষেত্রে যেখানে_আর_না

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

138

Aআপনার 2D অ্যারে কোথায় :

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

ফাংশনটি isnanএকটি বুল অ্যারে তৈরি করে যেখানে NaNমানগুলি তা নির্দেশ করে । একটি বুলিয়ান অ্যারে একই আকারের একটি অ্যারে সূচক করতে ব্যবহৃত হতে পারে। এটিকে মুখোশের মতো ভাবুন।


40

11
nan_to_num () এছাড়াও অসম্পূর্ণতা পরিবর্তন করে - এটি কিছু ক্ষেত্রে অযাচিত হতে পারে।
আগোগোস

11
এটি অন্যান্য> অন্যান্য পদ্ধতির তুলনায় 10x ধীর।
ব্যবহারকারীর 48956

7
আমি টাট "> 10 এক্স ধীর" বিবৃতি সম্পর্কে নিশ্চিত ছিলাম না তাই আমি পরীক্ষা করেছিলাম। আসলে, এটি অনেক ধীর। এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ.
গ্যাব্রিয়েল

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.]])

4
যেমনটি এটি কাজ করে না, আপনাকে পরিবর্তন np.where(np.isnan(a), a, 0)করতে হবে np.where(~np.isnan(a), a, 0)। যদিও এটি ব্যবহৃত সংস্করণগুলিতে পার্থক্য হতে পারে।
তেহট্রিস

4
@ টিহটিরিস আপনি ঠিক বলেছেন, ধন্যবাদ আমি এটিকে পরিবর্তন করেছিলাম 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এটি 1 ডি অ্যারে, সুতরাং পরীক্ষাটি 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
আপনার মন্তব্য কি কিছুটা কঠোর নয়? আমি জানি যে নম্পতি কী, তবে আমি জানি যে অ্যারে সংখ্যার স্ট্রিং উপস্থাপনা হবে না। আমি বিশেষত এটিকে অবাস্তব দৃষ্টিভঙ্গি থেকে পাইনি তবে পাইথনের দৃষ্টিকোণ থেকে, যদি এটি কার্যকর হয়।
সেন্থিল কুমারান

4
অ্যারেটিকে পুনরায় অর্ডার করা কেবল এটিকে সমাধান করার বিভ্রান্তিকর মতো মনে হচ্ছে।
হলোগ্রাফিক্স

আমার অ্যারের ক্রমটি সংরক্ষণ করা দরকার। আপনার অ্যারেতে একাধিক 'NaN' থাকলে এটি কাজ করবে না।
3nrique0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.