खाली सुन्न सरणी में एक नई पंक्ति कैसे जोड़ें


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
जिस तरह से सुन्न arrays काम करते हैं, आप बहुत बेहतर एक खाली सरणी का निर्माण कर रहे हैं और फिर डेटा डाल रहे हैं, उदाहरण के लिए देखें 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)

लेकिन, @jonrsharpe सही है। वास्तव में, यदि आप एक लूप में शामिल होने जा रहे हैं, तो अपने पहले उदाहरण के रूप में किसी सूची में शामिल होना बहुत तेज़ होगा, फिर अंत में एक सुस्पष्ट सरणी में कनवर्ट करें, क्योंकि आप वास्तव में जैसे कि खतना का उपयोग नहीं कर रहे हैं पाश के दौरान इरादा:

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 Phi

@ रॉबर्टो, आमतौर पर अग्रिम में सरणी के आकार या आकार (बहुत कम से कम, मान बेहतर होगा) का निर्धारण करने का कोई तरीका है। क्या आपको लगता है कि आप ऐसा कर सकते हैं? लागू करना वास्तव में एक या दो बार ऑपरेशन होना चाहिए।
Askewchan

कभी-कभी आप आयामों का अनुमान नहीं लगा सकते, यह जीवन है। हालाँकि आप एक बड़ा पर्याप्त सरणी आवंटित कर सकते हैं और इसके विचारों को मान दे सकते हैं। हालांकि मुझे यह पसंद नहीं है, क्योंकि अवांछित मूल्य हैं जो किसी को "मुखौटा" करने का एक तरीका खोजना होगा। मास्किंग का यह विचार वास्तव में मेरे स्वाद के अनुरूप नहीं है।
राहो फी

नकाब की जरूरत नहीं, बस स्लाइस! a = a[:N] हालांकि मेरा दृढ़ता से मानना ​​है कि आपको इसे वेक्टर करने का एक तरीका ढूंढना चाहिए (यदि आपको मदद की ज़रूरत है तो अपनी बारीकियों के साथ एक नया प्रश्न पोस्ट करें) या लूप समाप्त होने तक सूची का उपयोग करें।
पूछवचन

29

यहाँ मेरा समाधान है:

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

परिणामी सरणी में ऑब्जेक्ट का dtype है, जो कुछ मामलों में स्वीकार्य नहीं है
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.concatenate फ़ंक्शन का उपयोग भी कर सकते हैं।

चियर्स


7
काम नहीं करेगा अगर दूसरे ऐरे में आयाम> = 2 जैसा हो ((2, 2))। ऐसा प्रतीत होता है कि सीमा मामलों को टालने का कोई तरीका नहीं है यदि आप संघनन से खाली से सरणियों का निर्माण कर रहे हैं।
ताओजी

हर बार आयाम की जांच करने के लिए एक अच्छा समाधान नहीं है।
SKR

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))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.