খালি নাম্বার অ্যারেতে কীভাবে একটি নতুন সারি যুক্ত করা যায়


158

স্ট্যান্ডার্ড পাইথন অ্যারে ব্যবহার করে, আমি নিম্নলিখিতগুলি করতে পারি:

arr = []
arr.append([1,2,3])
arr.append([4,5,6])
# arr is now [[1,2,3],[4,5,6]]

যাইহোক, আমি নমপিতে একই জিনিস করতে পারি না। উদাহরণ স্বরূপ:

arr = np.array([])
arr = np.append(arr, np.array([1,2,3]))
arr = np.append(arr, np.array([4,5,6]))
# arr is now [1,2,3,4,5,6]

আমি এটিতেও সন্ধান করেছি vstackতবে আমি যখন vstackখালি অ্যারে ব্যবহার করি তখন আমি পাই:

ValueError: all the input array dimensions except for the concatenation axis must match exactly

সুতরাং আমি কীভাবে একটি শূন্য অ্যারেতে একটি নতুন সারি যুক্ত করব?


1
যদি খালি থাকে তবে কেন বিরক্ত করবেন? কেবল প্রথম সারিতে থাকা একটি অ্যারে থেকে শুরু করুন।
জোনারশপে

10
আমি কেবল জানতে চাই যে খালি নাম্পার অ্যারেতে যুক্ত করা সম্ভব কিনা। অ্যাপেন্ড অপারেশনগুলি লুপে থাকায় কখনও কখনও কোডটি লিখতে এটি ক্লিনার।
টনি স্টার্ক

5
প্রদত্ত পথ numpy অ্যারে কাজ, তারপর আপনি যেমন দেখুন একটি খালি অ্যারে নির্মাণের তথ্য দেওয়া, অনেক ভাল হয় stackoverflow.com/questions/568962/...
jonrsharpe

উত্তর:


227

আপনি যে অ্যারে চান তা "শুরু" করার উপায়:

arr = np.empty((0,3), int)

যা একটি খালি অ্যারে তবে এটির সঠিক মাত্রা রয়েছে।

>>> arr
array([], shape=(0, 3), dtype=int64)

তারপরে অক্ষ 0 এর সাথে যুক্ত হওয়া নিশ্চিত করুন:

arr = np.append(arr, np.array([[1,2,3]]), axis=0)
arr = np.append(arr, np.array([[4,5,6]]), axis=0)

তবে, @ জোনারশপে ঠিক বলেছেন। প্রকৃতপক্ষে, আপনি যদি একটি লুপে সংযোজন করতে যাচ্ছেন তবে আপনার প্রথম উদাহরণের মতো একটি তালিকায় যুক্ত হওয়া আরও দ্রুত হবে, তারপরে শেষে একটি অসাধারণ অ্যারেতে রূপান্তর করুন, যেহেতু আপনি সত্যিকার অর্থে নকল ব্যবহার করছেন না লুপ চলাকালীন উদ্দেশ্য:

In [210]: %%timeit
   .....: l = []
   .....: for i in xrange(1000):
   .....:     l.append([3*i+1,3*i+2,3*i+3])
   .....: l = np.asarray(l)
   .....: 
1000 loops, best of 3: 1.18 ms per loop

In [211]: %%timeit
   .....: a = np.empty((0,3), int)
   .....: for i in xrange(1000):
   .....:     a = np.append(a, 3*i+np.array([[1,2,3]]), 0)
   .....: 
100 loops, best of 3: 18.5 ms per loop

In [214]: np.allclose(a, l)
Out[214]: True

এটি করার অসাধারণ উপায় আপনার আবেদনের উপর নির্ভর করে তবে এটি আরও পছন্দ হবে:

In [220]: timeit n = np.arange(1,3001).reshape(1000,3)
100000 loops, best of 3: 5.93 µs per loop

In [221]: np.allclose(a, n)
Out[221]: True

আমার যদি এই 10 ^ 5 বা 10 ^ 6 বার করতে হয় তবে কী হবে? দেখে মনে হচ্ছে যে এই দুটি পদ্ধতির কোনওটিই ধরে রাখবে না। যেকোনো পরামর্শ?
Rho ফি

@ রুবার্তো, সাধারণত অগ্রিম আকারের আকার বা আকৃতি নির্ধারণ করার কিছু উপায় রয়েছে (খুব কমপক্ষে, মানগুলি অগ্রাধিকারযোগ্য হবে)। আপনি কি মনে করতে পারেন যে আপনি এটি করতে পারেন? সংযোজন সত্যই এক বা দুই সময়ের অপারেশন হওয়া উচিত।
জিজ্ঞাসাবাদ

কখনও কখনও আপনি মাত্রা অনুমান করতে পারবেন না, এটি জীবন। তবে আপনি একটি বড় যথেষ্ট অ্যারে বরাদ্দ করতে পারেন এবং এর দর্শনগুলিকে মান দিতে পারেন। যদিও আমি এটি পছন্দ করি না, কারণ এমন কিছু অযাচিত মান রয়েছে যেগুলি "মুখোশ" দেওয়ার একটি উপায় খুঁজে বের করতে পারে। মাস্কিংয়ের এই ধারণাটি আমার স্বাদের সাথে খাপ খায় না।
Rho ফি

মুখোশের দরকার নেই, কেবল টুকরো টুকরো! a = a[:N] যদিও আমি দৃ strongly়ভাবে বিশ্বাস করি যে এটির ভেক্টরাইজ করার জন্য আপনার কোনও উপায় খুঁজে পাওয়া উচিত (আপনার সাহায্যের প্রয়োজন হলে আপনার নির্দিষ্টকরণের সাথে একটি নতুন প্রশ্ন পোস্ট করুন) বা লুপটি শেষ না হওয়া পর্যন্ত কেবল তালিকা ব্যবহার করুন।
askewchan

29

এখানে আমার সমাধান:

arr = []
arr.append([1,2,3])
arr.append([4,5,6])
np_arr = np.array(arr)

ফলস্বরূপ অ্যারেটিতে একটি ধরণের অবজেক্ট রয়েছে যা কিছু ক্ষেত্রে গ্রহণযোগ্য নয়
zer0fool

26

এই ক্ষেত্রে আপনি np.hstack এবং np.vstack ফাংশনটি ব্যবহার করতে পারেন

arr = np.array([])
arr = np.hstack((arr, np.array([1,2,3])))
# arr is now [1,2,3]

arr = np.vstack((arr, np.array([4,5,6])))
# arr is now [[1,2,3],[4,5,6]]

আপনি np.concateate ফাংশনটিও ব্যবহার করতে পারেন।

চিয়ার্স


7
দ্বিতীয় অ্যারেতে ডায়মেনশন> = 2 এর মতো (2, 2) থাকলে কাজ করবে না। আমার কাছে মনে হয় সীমান্ত কেসগুলি এড়ানোর কোনও উপায় নেই যদি আপনি কনটেন্টেশন করে খালি থেকে অ্যারে তৈরি করছেন।
তাওজি

প্রতিবারের জন্য মাত্রাটি পরীক্ষা করা দরকার বলে ভাল সমাধান নয়।
এসকেআর

1

একটি কাস্টম dtype সংজ্ঞা ব্যবহার করে, আমার জন্য কি কাজ করেছে তা হ'ল:

import numpy

# define custom dtype
type1 = numpy.dtype([('freq', numpy.float64, 1), ('amplitude', numpy.float64, 1)])
# declare empty array, zero rows but one column
arr = numpy.empty([0,1],dtype=type1)
# store row data, maybe inside a loop
row = numpy.array([(0.0001, 0.002)], dtype=type1)
# append row to the main array
arr = numpy.row_stack((arr, row))
# print values stored in the row 0
print float(arr[0]['freq'])
print float(arr[0]['amplitude'])

1

লুপে অ্যারের জন্য নতুন সারি যুক্ত করার ক্ষেত্রে, ফাঁকা অ্যারে শুরু করার পরিবর্তে লুপের মধ্যে প্রথম সময় অ্যারেটিকে সরাসরি বরাদ্দ করুন।

for i in range(0,len(0,100)):
    SOMECALCULATEDARRAY = .......
    if(i==0):
        finalArrayCollection = SOMECALCULATEDARRAY
    else:
        finalArrayCollection = np.vstack(finalArrayCollection,SOMECALCULATEDARRAY)

এটি মূলত কার্যকর হয় যখন অ্যারের আকারটি অজানা থাকে


0

আমি লুপের জন্য একটি করতে চাই, তবুও জিজ্ঞাসা পদ্ধতিতে এটি ভাল কাজ করে না, তাই আমি এটি পরিবর্তন করেছি।

x=np.empty((0,3))
y=np.array([1 2 3])
for i in ...
x = vstack((x,y))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.