একটি অদ্ভুত অ্যারে শুরু করুন


129

কোন আকারের একটি নম্র অ্যারে আরম্ভ করার এবং এটিতে যুক্ত করার উপায় আছে? তালিকার উদাহরণ সহ আমার কী প্রয়োজন তা আমি ব্যাখ্যা করব। যদি আমি কোনও লুপে উত্পন্ন জিনিসগুলির একটি তালিকা তৈরি করতে চাই তবে আমি এটি করতে পারি:

a = []
for i in range(5):
    a.append(i)

আমি ন্যালি অ্যারে দিয়ে অনুরূপ কিছু করতে চাই। আমি vstack, কনটেনেট ইত্যাদি সম্পর্কে জানি তবে যাইহোক, মনে হয় এগুলির জন্য ইনপুট হিসাবে দুটি অলস অ্যারে প্রয়োজন। আমার যা দরকার তা হ'ল:

big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
    array i of shape = (2,4) created.
    add to big_array

এর big_arrayএকটি আকার থাকা উচিত (10,4)। কিভাবে এই কাজ করতে?


সম্পাদনা করুন:

আমি নিম্নলিখিত ব্যাখ্যাটি যুক্ত করতে চাই। আমি সচেতন যে আমি সংজ্ঞা দিতে পারি big_array = numpy.zeros((10,4))এবং তারপরে এটি পূরণ করতে পারি । তবে এর জন্য আগে থেকে বড়_আরয়ের আকার নির্দিষ্ট করা দরকার। আমি এক্ষেত্রে আকারটি জানি, তবে আমি না করলে কী হয়? .appendপাইথনে তালিকা বাড়ানোর জন্য যখন আমরা ফাংশনটি ব্যবহার করি তখন আমাদের এর চূড়ান্ত আকারটি আগাম জানতে হবে না। আমি ভাবছি যে খালি অ্যারে দিয়ে শুরু করে ছোট অ্যারে থেকে আরও বড় অ্যারে তৈরি করার জন্য অনুরূপ কিছু উপস্থিত রয়েছে কিনা।


উল্লেখ্য আপনার প্রথম কোড নমুনা একটি তালিকা ধী হিসাবে সুন্দরভাবে এবং succinctly লেখা যেতে পারে: [i for i in range(5)]। (সমতুল্য: list(range(5))যদিও এটি একটি
স্বীকৃত

কি সমাধান আপনার জন্য কাজ করে? আমি অনুরূপ কিছু করার চেষ্টা করছি x = numpy.array()ঠিক যেমন একটি তালিকাতে আমরা করতাম y = []; তবে এটি কার্যকর হয়নি
kRazzy R

উত্তর:


160

numpy.zeros

প্রদত্ত আকার এবং প্রকারের নতুন অ্যারেটি জিরো দিয়ে পূর্ণ করুন Return

অথবা

numpy.ones

প্রদত্ত আকার এবং প্রকারের একটি নতুন অ্যারেটি পূরণ করুন, এতে ভরাট।

অথবা

numpy.empty

এন্ট্রি আরম্ভ না করে প্রদত্ত আকার এবং প্রকারের একটি নতুন অ্যারে ফেরত দিন।


তবে যে মানসিকতায় আমরা একটি তালিকায় উপাদান যুক্ত করে অ্যারে তৈরি করি তা আঙ্কে খুব বেশি ব্যবহৃত হয় না কারণ এটি কম দক্ষ (নিম্পী ডেটাটাইপগুলি অন্তর্নিহিত সি অ্যারেগুলির তুলনায় অনেক বেশি কাছাকাছি)। পরিবর্তে, আপনার অ্যারেটি যে আকারে হওয়া দরকার সেটিকে আগে থেকেই প্রাকলোকট করতে হবে এবং তারপরে সারিগুলি পূরণ করুন। আপনি numpy.appendঅবশ্যই ব্যবহার করতে পারেন , যদিও।


2
আমি জানি যে আমি বড়_আরে = numpy.zeros সেট করতে পারি এবং তারপরে এটি তৈরি করা ছোট অ্যারে দিয়ে পূরণ করতে পারি। তবে এটির জন্য আমার আগে থেকে বড়_আরয়ের আকার নির্দিষ্ট করা দরকার। তালিকার ক্রিয়াকলাপের .append এর মতো কিছুই নেই যেখানে আগে থেকে নির্দিষ্ট আকারটি আমার কাছে নেই। ধন্যবাদ!
কৌতূহলী 2

2
@ Curious2learn। না, নিম্পিতে অ্যাপেন্ডের মতো কিছুই নেই। এমন ক্রিয়াকলাপ রয়েছে যা অ্যারেগুলিকে একত্রিত করে বা নতুন অ্যারে তৈরি করে স্ট্যাক করে তবে তারা যুক্ত করে তা করে না by এটি ডেটা স্ট্রাকচারগুলি সেট আপ করার উপায়ের কারণেই। ন্যম্পি অ্যারেগুলিকে আরও কমপ্যাক্টভাবে মান সংরক্ষণ করতে সক্ষম হওয়ার কারণে দ্রুত করা হয় তবে এ গতিটি অর্জনের জন্য তাদের নির্দিষ্ট আকার হওয়া দরকার। পাইথন তালিকাগুলি গতি এবং আকারের ব্যয়ে আরও নমনীয় হওয়ার জন্য ডিজাইন করা হয়েছে।
জাস্টিন পিল

3
@ কারকিউরিস: ঠিক আছে, appendঅসাধারণ একটি সংখ্যা আছে। এটি ঠিক যে এটি প্রিলোকোট না করা কম দক্ষ (এই ক্ষেত্রে, যত কম দক্ষ, appendপ্রতিবার পুরো অ্যারে অনুলিপি করার পরে), সুতরাং এটি কোনও স্ট্যান্ডার্ড কৌশল নয়।
ক্যাট্রিয়েল

1
np.emptyঅ্যারের কেবলমাত্র একটি অংশ যদি মান দ্বারা পূর্ণ হয়? বাকি "খালি" আইটেমগুলি সম্পর্কে কী?
লি

1
আপনি শুধুমাত্র প্রস্থ (যেমন জন্য প্রয়োজনীয় জানেন জানেন তাহলে np.concatenate()), আপনি সঙ্গে আরম্ভ করতে পারেন: np.empty((0, some_width))। 0, যাতে আপনার প্রথম অ্যারে আবর্জনা হবে না।
নিউজসঙ্গুইস

40

আমি যেভাবে সাধারণত এটি করি তা হ'ল নিয়মিত তালিকা তৈরি করে, তারপরে আমার স্টাফগুলিকে এতে যুক্ত করুন এবং শেষ পর্যন্ত তালিকাটিকে একটি অদ্ভুত অ্যারে রূপান্তর করুন:

import numpy as np
big_array = [] #  empty regular list
for i in range(5):
    arr = i*np.ones((2,4)) # for instance
    big_array.append(arr)
big_np_array = np.array(big_array)  # transformed to a numpy array

অবশ্যই আপনার চূড়ান্ত বস্তুটি তৈরির পদক্ষেপে স্মৃতিতে দ্বিগুণ স্থান গ্রহণ করে তবে পাইথন তালিকায় যুক্ত করা খুব দ্রুত এবং এনপি.আরএ () ব্যবহার করেও তৈরি করা যায় creation


11
আপনি যদি আগে সময়ের অ্যারের আকারটি জানেন তবে এটি যাওয়ার উপায় নয় ... তবে আমি এই পদ্ধতিটি ঘন ঘন ব্যবহার করে শেষ করি যখন আমি জানি না যে অ্যারেটি কত বড় হবে। উদাহরণস্বরূপ, কোনও ফাইল বা অন্য কোনও প্রক্রিয়া থেকে ডেটা পড়ার সময়। পাইথন ও অদ্ভুত বেশ চতুর হওয়ায় এটি প্রথমে মনে হতে পারে ততটা ভয়ঙ্কর নয়।
travc

18

অদ্ভুত 1.8 তে পরিচয় করিয়ে দেওয়া:

numpy.full

প্রদত্ত আকার এবং প্রকারের একটি নতুন অ্যারেটি পূরণ করুন, ভরে_ভ্যালুতে ভরা।

উদাহরণ:

>>> import numpy as np
>>> np.full((2, 2), np.inf)
array([[ inf,  inf],
       [ inf,  inf]])
>>> np.full((2, 2), 10)
array([[10, 10],
       [10, 10]])

13

অজগরটির জন্য অ্যারে অ্যানালগ

a = []
for i in range(5):
    a.append(i)

হল:

import numpy as np

a = np.empty((0))
for i in range(5):
    a = np.append(a, i)

5
@ নিকোলাসটিজে: empty((0))একটি অদ্ভুত অ্যারে সূচনা করে।
অ্যাডোব

2
np.empty ((0)) এ বন্ধনীগুলি অপ্রয়োজনীয়।
সিজমন রোজিউস্কি

7

numpy.fromiter() আপনি যা খুঁজছেন তা হ'ল:

big_array = numpy.fromiter(xrange(5), dtype="int")

এটি জেনারেটর এক্সপ্রেশনগুলির সাথেও কাজ করে, যেমন:

big_array = numpy.fromiter( (i*(i+1)/2 for i in xrange(5)), dtype="int" )

আপনি যদি অ্যারের দৈর্ঘ্য আগেই জানেন তবে আপনি এটি একটি optionচ্ছিক 'গণনা' যুক্তি দিয়ে নির্দিষ্ট করতে পারেন।


2
আমি আসলে টাইমিট চালিয়েছি এবং আমি মনে করি যে এনপি.ফ্রেমিটার () np.array () এর চেয়ে ধীর হতে পারে। টাইমিট ("এনপি.আররে (আমি এক্সরেঞ্জে আমি (100))", সেটআপ = "এনপি হিসাবে নাম্বার আমদানি করুন", সংখ্যা = 10000) -> 0.02539992332458496, সময়কাল বিপরীতে ("এনপি.ফ্রমিটার (আমার জন্য এক্সরেঞ্জে ( 100)), dtype = int) ", সেটআপ =" এনপি হিসাবে নাম্বার আমদানি করুন ", সংখ্যা = 10000) -> 0.13351011276245117
hlin117

6

অ্যারে কম্পিউটিং করার সময় আপনি যতটা সম্ভব স্পষ্ট লুপগুলি এড়াতে চান না, কারণ এটি সেইরূপের কম্পিউটিংয়ের গতি অর্জনকে হ্রাস করে। একটি নমপি অ্যারে শুরু করার একাধিক উপায় রয়েছে। আপনি যদি এটি শূন্যে ভরাতে চান তবে ক্যাটরিলেক্স যেমন বলেছিলেন তেমন করুন:

big_array = numpy.zeros((10,4))

সম্পাদনা: আপনি কী ধরণের ক্রম তৈরি করছেন? আপনার অ্যারে তৈরি করার মতো বিভিন্ন নম্পূর্ণ ফাংশনগুলি পরীক্ষা করা উচিত, যেমন numpy.linspace(start, stop, size)(সমান দুরত্বের সংখ্যা), বা numpy.arange(start, stop, inc)। যেখানে সম্ভব হবে, এই ফাংশনগুলি সুস্পষ্ট লুপগুলিতে একই কাজ করার চেয়ে যথেষ্ট দ্রুততর করা হবে


5

আপনার প্রথম অ্যারের উদাহরণ ব্যবহারের জন্য,

a = numpy.arange(5)

বড়_আরে শুরু করতে, ব্যবহার করুন

big_array = numpy.zeros((10,4))

এটি ধরে নিয়েছে যে আপনি শূন্যগুলির সাথে আরম্ভ করতে চান, এটি বেশ সাধারণ, তবে ন্যারিগুলিতে অ্যারের সূচনা করার আরও অনেক উপায় রয়েছে

সম্পাদনা: আপনি যদি বড়_আরয়ের আকারটি আগাম জানেন না, তবে প্রথমে অ্যাপেন্ড ব্যবহার করে প্রথমে পাইথন তালিকা তৈরি করা সবচেয়ে ভাল এবং আপনি যখন তালিকার মধ্যে সমস্ত কিছু সংগ্রহ করেন, তখন এই তালিকাটি ব্যবহার করে একটি নিমপী অ্যারে রূপান্তর করুন numpy.array(mylist)। এর কারণ হ'ল তালিকাগুলি খুব দক্ষতার সাথে এবং দ্রুত বৃদ্ধি পেতে বোঝানো হয়েছে, যেখানে numpy.concateate খুব অকার্যকর হবে কারণ নম্পি অ্যারেগুলি সহজেই আকার পরিবর্তন করে না। তবে একবার যখন সমস্ত কিছু একটি তালিকায় সংগ্রহ করা হয়ে যায় এবং আপনি চূড়ান্ত অ্যারের আকারটি জানেন, তখন একটি অদ্ভুত অ্যারে দক্ষতার সাথে তৈরি করা যায়।


5

একটি নির্দিষ্ট ম্যাট্রিক্সের সাথে একটি নমপি অ্যারে শুরু করতে:

import numpy as np

mat = np.array([[1, 1, 0, 0, 0],
                [0, 1, 0, 0, 1],
                [1, 0, 0, 1, 1],
                [0, 0, 0, 0, 0],
                [1, 0, 1, 0, 1]])

print mat.shape
print mat

আউটপুট:

(5, 5)
[[1 1 0 0 0]
 [0 1 0 0 1]
 [1 0 0 1 1]
 [0 0 0 0 0]
 [1 0 1 0 1]]

3

আপনি যখনই নিম্নলিখিত পরিস্থিতিতে আছেন:

a = []
for i in range(5):
    a.append(i)

এবং আপনি ন্যুপাতে অনুরূপ কিছু চান, বেশ কয়েকটি পূর্ববর্তী উত্তরগুলি এটি করার উপায়গুলি নির্দেশ করেছে, কিন্তু @ কেট্রিলেল্যাক্স নির্দেশ করে যে এই পদ্ধতিগুলি কার্যকর নয়। এটি করার কার্যকর উপায় হ'ল একটি দীর্ঘ তালিকা তৈরি করা এবং তারপরে দীর্ঘ তালিকা তৈরির পরে আপনি যেভাবে চান তা পুনরায় আকার দিন। উদাহরণস্বরূপ, ধরা যাক আমি একটি ফাইল থেকে কিছু লাইন পড়ছি এবং প্রতিটি সারিতে সংখ্যার একটি তালিকা রয়েছে এবং আমি একটি ছোট আকারের আকৃতি তৈরি করতে চাই (প্রতিটি লাইনে পঠিত লাইনের সংখ্যা, ভেক্টরের দৈর্ঘ্য)। এখানে আমি আরও দক্ষতার সাথে কীভাবে করব তা এখানে:

long_list = []
counter = 0
with open('filename', 'r') as f:
    for row in f:
        row_list = row.split()
        long_list.extend(row_list)
        counter++
#  now we have a long list and we are ready to reshape
result = np.array(long_list).reshape(counter, len(row_list)) #  desired numpy array

2

আমি বুঝতে পারি যে এটি কিছুটা দেরি হয়ে গেছে, তবে আমি খালি অ্যারেতে সূচি উল্লেখ করার মতো অন্য কোনও উত্তর লক্ষ্য করিনি:

big_array = numpy.empty(10, 4)
for i in range(5):
    array_i = numpy.random.random(2, 4)
    big_array[2 * i:2 * (i + 1), :] = array_i

এইভাবে, আপনি পুরো ফলাফল অ্যারের সাথে প্রাকপলোকট করেন numpy.emptyএবং সারণীযুক্ত অ্যাসাইনমেন্টটি ব্যবহার করার সাথে সাথে সারিগুলি পূরণ করুন।

আপনি যে উদাহরণটি দিয়েছিলেন তার emptyপরিবর্তে এটি পূর্বনির্ধারণ করা পুরোপুরি নিরাপদ zerosযেহেতু আপনি গ্যারান্টি দিচ্ছেন যে আপনি তৈরি করেছেন এমন খণ্ডগুলি পুরো অ্যারে ভরে যাবে।


2

আমি প্রথমে আকার নির্ধারণ করার পরামর্শ দেব। তারপরে মান সন্নিবেশ করার জন্য এটির উপরে পুনরাবৃত্তি করুন।

big_array= np.zeros(shape = ( 6, 2 ))
for it in range(6):
    big_array[it] = (it,it) # For example

>>>big_array

array([[ 0.,  0.],
       [ 1.,  1.],
       [ 2.,  2.],
       [ 3.,  3.],
       [ 4.,  4.],
       [ 5.,  5.]])

1

সম্ভবত এর মতো কিছু আপনার প্রয়োজনের সাথে খাপ খায় ..

import numpy as np

N = 5
res = []

for i in range(N):
    res.append(np.cumsum(np.ones(shape=(2,4))))

res = np.array(res).reshape((10, 4))
print(res)

যা নিম্নলিখিত আউটপুট উত্পাদন করে

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