NaN- তে ভরা নপি ম্যাট্রিক্স তৈরি করুন


195

আমার কাছে নিম্নলিখিত কোড রয়েছে:

r = numpy.zeros(shape = (width, height, 9))

এটি width x height x 9শূন্যে ভরা একটি ম্যাট্রিক্স তৈরি করে । পরিবর্তে, আমি জানতে চাই যে NaNকোনও সহজ উপায়ের পরিবর্তে সেগুলি শুরু করার কোনও ফাংশন বা উপায় আছে কিনা ।


2
একটি সতর্কতা হ'ল নুমপাইয়ের পূর্ণসংখ্যার এনএ মান হয় না (আর এর বিপরীতে)। গ্যাটাছের পান্ডাস তালিকা দেখুন । সুতরাং np.nanint এ রূপান্তরিত হলে ভুল হয়।
smci

স্ম্কি ঠিক আছে। NumPy এর জন্য এমন কোনও NaN মান নেই। সুতরাং এটি টাইপ এবং NumPy উপর নির্ভর করে কোন মানটি NaN এর জন্য থাকবে। আপনি যদি এটি সম্পর্কে অবগত না হন তবে এটি সমস্যার কারণ হতে পারে
মাস্টারকন্ট্রোল প্রোগ্রাম

উত্তর:


271

আপনার কাছে কমই ভেক্টর অপারেশনের জন্য লুপের প্রয়োজন need আপনি একটি অনির্বাচিত অ্যারে তৈরি করতে এবং একবারে সমস্ত এন্ট্রিগুলিকে নিয়োগ করতে পারেন:

>>> a = numpy.empty((3,3,))
>>> a[:] = numpy.nan
>>> a
array([[ NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN]])

আমি বিকল্পগুলি a[:] = numpy.nanএখানে সময় মতো করেছি এবং a.fill(numpy.nan)যেমনটি ব্লেনক পোস্ট করেছেন:

$ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a.fill(np.nan)"
10000 loops, best of 3: 54.3 usec per loop
$ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a[:] = np.nan" 
10000 loops, best of 3: 88.8 usec per loop

সময় ndarray.fill(..)দ্রুত বিকল্প হিসাবে হিসাবে একটি পছন্দ দেখায় । ওটিও, আমি নমপির সুবিধার্থে বাস্তবায়ন পছন্দ করি যেখানে আপনি সেই সময়টিতে পুরো টুকরোকে মান নির্ধারণ করতে পারেন, কোডটির উদ্দেশ্যটি খুব স্পষ্ট।

নোট করুন যে ndarray.fillএটির কাজটি যথাস্থানে সম্পাদন করে, তাই numpy.empty((3,3,)).fill(numpy.nan)পরিবর্তে ফিরে আসবে None


8
আমি সম্মত হই যে আপনার কোডের উদ্দেশ্যটি আরও পরিষ্কার। তবে পক্ষপাতহীন সময়গুলির জন্য ধন্যবাদ (বা বরং, আপনি এখনও তাদের পোস্ট করেছেন), আমি এটির প্রশংসা করি :)
জর্জে ইস্রায়েল পেরিয়া

2
এই এক মত আমি: a = numpy.empty((3, 3,)) * numpy.nan। এটি সময় নির্ধারণের চেয়ে fillঅ্যাসাইনমেন্ট পদ্ধতির চেয়ে ধীরে ধীরে ধীরে ধীরে এগিয়ে গেছে তবে এটি অননিলাইনার !!
হেলটনবাইকার

2
দয়া করে এই উত্তরটি দেখুন: stackoverflow.com/questions/10871220/…
ইভান

3
আমি .fill()পদ্ধতিটি পছন্দ করি তবে অ্যারে বড় হওয়ার সাথে সাথে গতির পার্থক্যটি কার্যতঃ কিছুই হ্রাস পায়।
nnot101

4
... কারণ np.empty([2, 5])একটি অ্যারে তৈরি করে, তারপরে fill()সেই অ্যারেটিকে সংশোধন করে তবে কোনও অনুলিপি বা রেফারেন্স দেয় না। আপনি যদি np.empty(2, 5)কোনও নামে কল করতে চান ("অ্যাসাইনমেন্টটি একটি ভেরিয়েবলের কাছে দেওয়া হয়"), আপনি এটি-তে স্থান নির্ধারণের আগে এটি করতে হবে। একই ধরনের জিনিস আপনি যদি করেন [1, 2, 3].insert(1, 4)। তালিকাটি তৈরি করা হয় এবং একটি 4 isোকানো হয় তবে তালিকার কোনও রেফারেন্স পাওয়া অসম্ভব (এবং এইভাবে এটি আবর্জনা সংগ্রহ করা হয়েছে বলে ধরে নেওয়া যেতে পারে)। স্ট্রিংয়ের মতো অপরিবর্তনীয় ডেটাগুলিতে, একটি অনুলিপি ফিরে আসে, কারণ আপনি জায়গায় জায়গায় কাজ করতে পারবেন না। পান্ডারা দুজনেই করতে পারেন।
ফ্লুটফ্রেইক 7

164

অন্য বিকল্পটি হ'ল numpy.fullনুমপি 1.8+ এ উপলব্ধ একটি বিকল্প

a = np.full([height, width, 9], np.nan)

এটি বেশ নমনীয় এবং আপনি এটি যে কোনও নম্বর দিয়ে এটি পূরণ করতে পারেন।


19
আমি এটিকে সবচেয়ে সঠিক উত্তর হিসাবে বিবেচনা করব কারণ এটি হ'ল সঠিকভাবে যা fullবোঝাতে চেয়েছিল। np.empy((x,y))*np.nanএটি একটি ভাল রানার-আপ (এবং নমপির পুরানো সংস্করণগুলির জন্য সামঞ্জস্যতা)।
ট্র্যাভিসি

এটি ধীরে ধীরেfill python -mtimeit "import numpy as np; a = np.empty((100,100));" "a.fill(np.nan)" 100000 loops, best of 3: 13.3 usec per loop python -mtimeit "import numpy as np; a = np.full((100,100), np.nan);" 100000 loops, best of 3: 18.5 usec per loop
ফার্নবাজ

5
@ ফারনাবাজ আপনি যদি টাইমিং লুপের ভিতরে সমমানের কোডটি রাখেন তবে সেগুলি প্রায় একই রকম। দুটি পদ্ধতি মূলত সমান, আপনি প্রথমটি টাইমারের বাইরে সবেমাত্র "np.empty" পেয়েছেন। python -mtimeit "import numpy as np; a = np.empty((1000,1000)); a.fill(np.nan)" 1000 loops, best of 3: 381 usec per loop $ python -mtimeit "import numpy as np; a = np.full((1000,1000), np.nan);" 1000 loops, best of 3: 383 usec per loop
স্কট স্টানিউইকজ

48

আমি গতির জন্য প্রস্তাবিত বিকল্পগুলি তুলনা করে দেখেছি যে, যথেষ্ট পরিমাণে ভেক্টর / ম্যাট্রিকগুলি পূরণ করার জন্য, সমস্ত বিকল্প ব্যতীত val * onesএবং array(n * [val])সমান দ্রুত।

এখানে চিত্র বর্ণনা লিখুন


প্লটটি পুনরুত্পাদন করার কোড:

import numpy
import perfplot

val = 42.0


def fill(n):
    a = numpy.empty(n)
    a.fill(val)
    return a


def colon(n):
    a = numpy.empty(n)
    a[:] = val
    return a


def full(n):
    return numpy.full(n, val)


def ones_times(n):
    return val * numpy.ones(n)


def list(n):
    return numpy.array(n * [val])


perfplot.show(
    setup=lambda n: n,
    kernels=[fill, colon, full, ones_times, list],
    n_range=[2 ** k for k in range(20)],
    logx=True,
    logy=True,
    xlabel="len(a)",
)

আশ্চর্যজনক যে এটি অভ্যন্তরীণভাবে একই জিনিসটি করার numpy.full(n, val)চেয়ে ধীরে ধীরেa = numpy.empty(n) .. a.fill(val)
এন্ডোলিথ

26

আপনি কি সাথে পরিচিত numpy.nan?

আপনি নিজের পদ্ধতি তৈরি করতে পারেন যেমন:

def nans(shape, dtype=float):
    a = numpy.empty(shape, dtype)
    a.fill(numpy.nan)
    return a

তারপর

nans([3,4])

আউটপুট হবে

array([[ NaN,  NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN,  NaN]])

আমি এই কোডটি একটি মেলিং তালিকার থ্রেডে পেয়েছি ।


1
ওভারকিলের মতো মনে হচ্ছে।
ম্যাড পদার্থবিদ

@ ম্যাডফিসিসিস্ট এটি সম্পূর্ণ আপনার পরিস্থিতির উপর নির্ভর করে। যদি আপনাকে কেবল একটি একক NaN অ্যারে শুরু করতে হয়, তবে হ্যাঁ, একটি কাস্টম ফাংশন সম্ভবত ওভারকিল। তবে আপনার কোডটিতে কয়েক ডজন জায়গায় যদি আপনাকে কোনও এনএএন অ্যারে শুরু করতে হয় তবে এই ফাংশনটি রাখা বেশ সুবিধাজনক হয়ে যায়।
শুকরাও

1
@Xukaro। সত্যিই নয়, এই জাতীয় ফাংশনের আরও নমনীয় এবং দক্ষ সংস্করণ ইতিমধ্যে বিদ্যমান এবং একাধিক অন্যান্য উত্তরে উল্লেখ করা হয়েছে is
ম্যাড পদার্থবিদ 15

10

আপনি যদি অবিলম্বে পদ্ধতি .emptyবা .fullপদ্ধতিগুলি স্মরণ না করেন তবে আপনি সর্বদা গুণ ব্যবহার করতে পারেন :

>>> np.nan * np.ones(shape=(3,2))
array([[ nan,  nan],
       [ nan,  nan],
       [ nan,  nan]])

অবশ্যই এটি অন্যান্য যে কোনও সংখ্যাসূচক মানের সাথেও কাজ করে:

>>> 42 * np.ones(shape=(3,2))
array([[ 42,  42],
       [ 42,  42],
       [ 42, 42]])

তবে @ u0b34a0f6ae এর গৃহীত উত্তরটি দ্রুততর দ্রুত (সিপিইউ চক্রগুলি, নাম্বার সিনট্যাক্স মনে রাখার জন্য মস্তিষ্কের চক্র নয়;):

$ python -mtimeit "import numpy as np; X = np.empty((100,100));" "X[:] = np.nan;"
100000 loops, best of 3: 8.9 usec per loop
(predict)laneh@predict:~/src/predict/predict/webapp$ master
$ python -mtimeit "import numpy as np; X = np.ones((100,100));" "X *= np.nan;"
10000 loops, best of 3: 24.9 usec per loop

6

আরেকটি বিকল্প হ'ল numpy.broadcast_to(val,n)যা আকার নির্বিশেষে ধ্রুবক সময়ে ফিরে আসে এবং সর্বাধিক স্মৃতিশক্তি দক্ষ (এটি পুনরাবৃত্ত উপাদানটির একটি দৃশ্য ফেরত দেয়)। সাবধানতা হল যে প্রত্যাবর্তিত মানটি কেবল পঠনযোগ্য।

নীচো শ্ল্যামারের উত্তরের মতো একই মানদণ্ড ব্যবহার করে প্রস্তাবিত অন্যান্য সমস্ত পদ্ধতির পারফরম্যান্সের তুলনা নীচে দেওয়া হয়েছে ।

এখানে চিত্র বর্ণনা লিখুন


5

যেমন বলা হয়েছে, numpy.empty () হল যাওয়ার উপায়। যাইহোক, বস্তুর জন্য, ফিল () আপনার মনে হয় ঠিক যা করতে পারে তা করতে পারে না:

In[36]: a = numpy.empty(5,dtype=object)
In[37]: a.fill([])
In[38]: a
Out[38]: array([[], [], [], [], []], dtype=object)
In[39]: a[0].append(4)
In[40]: a
Out[40]: array([[4], [4], [4], [4], [4]], dtype=object)

চারপাশের একটি উপায় যেমন হতে পারে:

In[41]: a = numpy.empty(5,dtype=object)
In[42]: a[:]= [ [] for x in range(5)]
In[43]: a[0].append(4)
In[44]: a
Out[44]: array([[4], [], [], [], []], dtype=object)

মূল প্রশ্নটির সাথে কার্যত কিছুই করার নেই, ঝরঝরে।
ম্যাড পদার্থবিদ

1
ঠিক আছে, এটি "শূন্য বা এক ব্যতীত অন্য কিছুতে নাম্পার ম্যাট্রিক্সের সূচনাকরণ" সম্পর্কে, "" অন্য কিছু "হ'ল একটি বিষয় :) (আরও কার্যত গুগল খালি তালিকার সাথে সূচনা করার জন্য আমাকে এখানে
নিয়েছিল

3

এখনও আরেকটি সম্ভাবনা এখানে উল্লেখ করা হয়নি হ'ল নম্পপি টাইল ব্যবহার করা:

a = numpy.tile(numpy.nan, (3, 3))

দেয়ও

array([[ NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN]])

গতির তুলনা সম্পর্কে আমি জানি না।

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