NumPy অ্যারে প্রারম্ভিককরণ (অভিন্ন মান পূরণ করুন)


237

আমার দৈর্ঘ্যের একটি NumPy অ্যারে তৈরি করা দরকার n, যার প্রতিটি উপাদান v

এর চেয়ে ভাল কিছু আছে কি:

a = empty(n)
for i in range(n):
    a[i] = v

আমি জানি zerosএবং onesV = 0, 1. আমি ব্যবহার করতে পারে জন্য কাজ করবে v * ones(n), কিন্তু এটা কাজ যখন না vহয় None, এবং এছাড়াও অনেক ধীর হবে।


1
আমার কম্পিউটারে, 0 ক্ষেত্রে জন্য ব্যবহার a = np.zeros(n)লুপ দ্রুত চেয়ে a.fill(0)। এটি আমার প্রত্যাশার পরিপন্থী যেহেতু আমি ভেবেছিলাম a=np.zeros(n)নতুন মেমরি বরাদ্দকরণ এবং আরম্ভ করার প্রয়োজন হবে। যদি কেউ এটি ব্যাখ্যা করতে পারে তবে আমি এটির প্রশংসা করব।
user3731622

আপনি কোথাও কোনও নিম্পের অ্যারে রাখতে পারবেন না, যেহেতু কোষগুলি একটি নির্দিষ্ট ডেটা টাইপ দিয়ে তৈরি করা হয় যখন কোনওটির নিজস্ব প্রকার নেই এবং আসলে এটি পয়েন্টার।
ক্যামিয়ন 15'19

@ ক্যামিয়ান হ্যাঁ আমি এখন জানি :) অবশ্যই v * ones(n)এখনও ভয়ঙ্কর, কারণ এটি ব্যয়বহুল গুণটি ব্যবহার করে। যদিও এর *সাথে প্রতিস্থাপন করুন এবং কিছু ক্ষেত্রে আশ্চর্যজনকরূপে ভাল প্রমাণিত হয়েছে ( স্ট্যাকওভারফ্লো . com / প্রশ্নস / 89৮৯1410/… )। +v + zeros(n)
সর্বাধিক

সর্বাধিক, ভি যোগ করার আগে শূন্যের সাথে একটি অ্যারে তৈরি করার পরিবর্তে এটি খালি তৈরি করা var = np.empty(n)এবং তারপরে এটি 'var [:] = v' দিয়ে পূরণ করা আরও দ্রুত । (বিটিডব্লিউ, এটির np.full()মতো দ্রুত)
ক্যামিয়ন 19'19 21

উত্তর:


308

NumPy 1.8 প্রবর্তিত np.full(), যা একটি নির্দিষ্ট মান দিয়ে ভরাট তৈরি করার জন্য empty()অনুসরণের চেয়ে আরও বেশি সরাসরি পদ্ধতি fill():

>>> np.full((3, 5), 7)
array([[ 7.,  7.,  7.,  7.,  7.],
       [ 7.,  7.,  7.,  7.,  7.],
       [ 7.,  7.,  7.,  7.,  7.]])

>>> np.full((3, 5), 7, dtype=int)
array([[7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7]])

এই তর্কসাপেক্ষে হয় নির্দিষ্ট মান দিয়ে পূর্ণ একটি অ্যারের তৈরি প্রণালী কারণ এটি স্পষ্টভাবে বর্ণনা করে কি অর্জন হচ্ছে (এবং নীতিগতভাবে খুব দক্ষ হতে পারে যেহেতু এটি একটি নির্দিষ্ট টাস্ক খুব সঞ্চালিত)।


1
এই পূর্ণ () পদ্ধতিটি আমার পক্ষে ভালভাবে কাজ করছে তবে আমি এর জন্য কিছু ডকুমেন্টেশন খুঁজে পাই না। কেউ আমাকে সঠিক জায়গায় নির্দেশ করতে পারেন?
জেমস অ্যাডামস

1
আপনি কমপক্ষে help(numpy.full)পাইথন শেলটি করতে পারেন। আমিও অবাক হয়েছি যে এটি ওয়েব ডকুমেন্টেশনে নেই।
এরিক হে লেবিগোট

আমার সিস্টেমে (পাইথন ২.7, নম্পি ১.৮), এনপি.ফুল () আসলে এনপি.ইম্পটি () এর পরে এনপি.ফিল () এর পরে কিছুটা ধীরে ধীরে।
জন জুইনক

1
10,000 উপাদানগুলির জন্য, আমি প্রায় 10% এর পার্থক্য সহ একই জিনিসটি পর্যবেক্ষণ করি ( np.fill()এটির অস্তিত্ব নেই এবং হওয়া উচিত arr.fill())। পার্থক্যটি যদি বড় হয় তবে আমি নম্পপি বাগ ট্র্যাকারে একটি সমস্যা উত্থাপন করব। :) আমি কার্যকর করার সময় যেমন একটি ছোট পার্থক্য জন্য, আরও স্পষ্ট এবং পরিষ্কার কোড পছন্দ, তাই আমি np.full()সব সময় সঙ্গে যেতে ।
এরিক হে লেবিগোট

আমার মেশিনে এনপি.ফুল () np.array.fill () এর সমান গতিতে
Fnord

92

Numpy 1.7.0 জন্য আপডেট করা হয়েছে: (। @Rolf Bartstra করার হাট-টিপ)

a=np.empty(n); a.fill(5) দ্রুততম হয়।

অবতরণী গতির ক্রমে:

%timeit a=np.empty(1e4); a.fill(5)
100000 loops, best of 3: 5.85 us per loop

%timeit a=np.empty(1e4); a[:]=5 
100000 loops, best of 3: 7.15 us per loop

%timeit a=np.ones(1e4)*5
10000 loops, best of 3: 22.9 us per loop

%timeit a=np.repeat(5,(1e4))
10000 loops, best of 3: 81.7 us per loop

%timeit a=np.tile(5,[1e4])
10000 loops, best of 3: 82.9 us per loop

13
আরও সাম্প্রতিক এবং সরাসরি জন্য একটি সময় যুক্ত np.full()দরকারী হবে। আমার মেশিনে, NumPy 1.8.1 সহ, এটি কম সরাসরি fill()সংস্করণের চেয়ে প্রায় 15% ধীর (যা অপ্রত্যাশিত, full()সামান্য দ্রুত যাওয়ার সম্ভাবনা রয়েছে)।
এরিক হে লেবিগোট

@ ডেভিডস্যান্ডার্স: আমি নিশ্চিত নই যে আমি আপনাকে অনুসরণ করছি: fill()দ্রুততম সমাধান এটি। গুণটির সমাধানটি অনেক ধীর।
এরিক হে লেবিগোট

2
দ্রষ্টব্য: যদি গতি সত্যিই উদ্বেগজনক হয় তবে এর 10000পরিবর্তে আকারের 1e4ব্যবহারটি কোনও কারণে লক্ষণীয় পার্থক্য তৈরি করে ( full()প্রায় 50% ধীর গতির সাথে 1e4))
এরিক হে লেবিগোট

কেবলমাত্র আমার ফলাফলগুলি যুক্ত করার সাথে সাথে full(), যখন ডেটাটাইপ স্পষ্টভাবে একটি ভাসা নয় it অন্যথায়, এটি এখানে সেরা পদ্ধতির সাথে তুলনাযোগ্য (তবে কিছুটা ধীর)।
ব্যবহারকারী2699

@ user2699 আমি এই দেখে করছি না, 100,000 উপাদানের সঙ্গে: full(100000, 5), full(100000, 5, dtype=float), full(100000, 5, dtype=int)এবং a =np.empty(100000); a.fill(5)আমার মেশিনে একই সময় সম্পর্কে সব নিতে (কোন ক্যাশে সঙ্গে %timeit -r1 -n1 …) (NumPy 1.11.2)।
এরিক হে লেবিগোট

65

আমি বিশ্বাস করি fillএটি করার দ্রুততম উপায়।

a = np.empty(10)
a.fill(7)

আপনি যেমন উদাহরণ হিসাবে করছেন তেমন আপনার পুনরাবৃত্তি হওয়া এড়ানো উচিত। একটি সরল a[:] = vনমুনা সম্প্রচার ব্যবহার করে আপনার পুনরাবৃত্তি যা করে তা সম্পাদন করবে ।


1
ধন্যবাদ. তাকানোর সময় fill, আমি দেখেছি যে repeatআমার প্রয়োজনগুলি আরও ভাল ফিট করে।
সর্বোচ্চ

আপনার প্রস্তাবটি a[:]=vআসলে আপনার তুলনায় আসলে আরও দ্রুত গতিতে বলতে কি আপনার উত্তর আপডেট করে আপত্তি জানায় fill?
সর্বোচ্চ 21

@ ম্যাক্স এটি দ্রুত? সম্প্রচার একটি অ্যারে পূরণের আরও সাধারণ উপায় এবং আমি অনুমান করব যে খুব সংকীর্ণ ব্যবহারের ক্ষেত্রে ধীর বা সমান fill
পল

16

স্পষ্টতই, কেবল পরম গতিই নয় গতি শৃঙ্খলা (যেমন ব্যবহারকারী 1579844 দ্বারা প্রতিবেদন করা) মেশিন নির্ভর; আমি যা পেয়েছি তা এখানে:

a=np.empty(1e4); a.fill(5) দ্রুততম;

অবতরণী গতির ক্রমে:

timeit a=np.empty(1e4); a.fill(5) 
# 100000 loops, best of 3: 10.2 us per loop
timeit a=np.empty(1e4); a[:]=5
# 100000 loops, best of 3: 16.9 us per loop
timeit a=np.ones(1e4)*5
# 100000 loops, best of 3: 32.2 us per loop
timeit a=np.tile(5,[1e4])
# 10000 loops, best of 3: 90.9 us per loop
timeit a=np.repeat(5,(1e4))
# 10000 loops, best of 3: 98.3 us per loop
timeit a=np.array([5]*int(1e4))
# 1000 loops, best of 3: 1.69 ms per loop (slowest BY FAR!)

সুতরাং, চেষ্টা করে দেখুন এবং আপনার প্ল্যাটফর্মের মধ্যে দ্রুততমটি ব্যবহার করুন।


14

আমার ছিল

numpy.array(n * [value])

মনে রাখবেন, তবে দৃশ্যত যা যথেষ্ট পরিমাণে অন্যান্য সমস্ত পরামর্শের চেয়ে ধীর n

এখানে পারফ্ল্লট (আমার একটি পোষা প্রাণী) এর সাথে সম্পূর্ণ তুলনা করা হচ্ছে ।

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

দুটি emptyবিকল্প এখনও দ্রুত (NumPy 1.12.1 সহ)। fullবড় অ্যারে জন্য ক্যাচ আপ।


প্লট তৈরির কোড:

import numpy as np
import perfplot


def empty_fill(n):
    a = np.empty(n)
    a.fill(3.14)
    return a


def empty_colon(n):
    a = np.empty(n)
    a[:] = 3.14
    return a


def ones_times(n):
    return 3.14 * np.ones(n)


def repeat(n):
    return np.repeat(3.14, (n))


def tile(n):
    return np.repeat(3.14, [n])


def full(n):
    return np.full((n), 3.14)


def list_to_array(n):
    return np.array(n * [3.14])


perfplot.show(
    setup=lambda n: n,
    kernels=[empty_fill, empty_colon, ones_times, repeat, tile, full, list_to_array],
    n_range=[2 ** k for k in range(27)],
    xlabel="len(a)",
    logx=True,
    logy=True,
)

7

আপনি numpy.tileযেমন ব্যবহার করতে পারেন :

v = 7
rows = 3
cols = 5
a = numpy.tile(v, (rows,cols))
a
Out[1]: 
array([[7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7]])

যদিও tileএকটি অ্যারের 'টালি' বোঝানো হয়েছে (এই ক্ষেত্রে যেমন একটি স্ক্যালারের পরিবর্তে), এটি কাজ করবে, কোনও আকার এবং মাত্রার প্রাক-ভরাট অ্যারে তৈরি করবে।


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