Numpy - सरणी में पंक्ति जोड़ें


161

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

मेरे पास एक सरणी है:

A = array([[0, 1, 2], [0, 2, 0]])

मैं एक और सरणी X से इस सरणी में पंक्तियों को जोड़ना चाहता हूं यदि X में प्रत्येक पंक्ति का पहला तत्व एक विशिष्ट स्थिति को पूरा करता है।

Numpy सरणियों में सूचियों की तरह 'परिशिष्ट' नहीं है, या ऐसा लगता है।

यदि A और X सूचियाँ होतीं तो मैं केवल यही करता:

for i in X:
    if i[0] < 3:
        A.append(i)

क्या समतुल्य करने के लिए एक संख्यात्मक तरीका है?

धन्यवाद, एस ;-)


जवाबों:


120

क्या है X? यदि यह एक 2D-सरणी है, तो आप इसकी पंक्ति की संख्या से तुलना कैसे कर सकते हैं i < 3:?

ओपी की टिप्पणी के बाद EDIT:

A = array([[0, 1, 2], [0, 2, 0]])
X = array([[0, 1, 2], [1, 2, 0], [2, 1, 2], [3, 2, 0]])

जहां पहला तत्व है, वहां Aसे सभी पंक्तियों में जोड़ें :X< 3

import numpy as np
A = np.vstack((A, X[X[:,0] < 3]))

# returns: 
array([[0, 1, 2],
       [0, 2, 0],
       [0, 1, 2],
       [1, 2, 0],
       [2, 1, 2]])

1
सॉरी गुड पॉइंट! 2 डी सरणी मान लीजिए जिसमें प्रत्येक पंक्ति के पहले तत्व को एक शर्त को पूरा करना होगा। मैं उसे संपादित करूंगा। धन्यवाद, एस ;-)
डैरेन जे। फिट्ज़पैट्रिक

2
@ DarrenJ.Fitzpatrick इस बात का ध्यान रखें कि इस प्रकार की जोड़-तोड़ करके आप जो अच्छा काम करते हैं, उसके विपरीत Numpy अपने मौजूदा एरे के लिए प्री-एलिमेंटिंग मेमोरी में करता है A। स्पष्ट रूप से छोटी समस्या जैसे इस उत्तर में यह समस्या नहीं है, लेकिन यह बड़े डेटा के लिए अधिक परेशान कर सकती है।
dtlussier

166

अच्छा आप यह कर सकते हैं:

  newrow = [1,2,3]
  A = numpy.vstack([A, newrow])

2
@ क्रिस यह पदावनत क्यों है? मुझे डॉक्स
Georgy

1
@Georgy ईमानदार होने के लिए, मुझे नहीं पता। मैं यहाँ आप के रूप में एक ही जवाब के लिए देख रहा था :-)। मुझे अब याद नहीं आ रहा है कि मैंने ऊपर टिप्पणी क्यों लिखी है। मैंने डॉक्स में इसके पदावनत देखा होगा। लेकिन अब डॉक्स को देखते हुए ... यह ऐसा नहीं कहता है। क्या यह संभव है कि उन्होंने इसे अपदस्थ कर दिया, फिर अपने दिमाग को फिर से बदल दिया और फैसला किया कि बहुत से लोगों को इसे हटाने और इसे हटाने के लिए बहुत अधिक कष्टप्रद होगा?
क्रिश

32

जैसा कि यह प्रश्न 7 साल पहले का है, नवीनतम संस्करण में जो मैं उपयोग कर रहा हूं वह संख्या 1.13 है, और python3, मैं मैट्रिक्स में एक पंक्ति जोड़ने के साथ एक ही काम कर रहा हूं, दूसरे तर्क के लिए एक डबल ब्रैकेट रखना याद रखें । अन्यथा, यह आयाम त्रुटि को बढ़ाएगा।

यहाँ मैं मैट्रिक्स A पर जोड़ रहा हूँ

1 2 3
4 5 6

एक पंक्ति के साथ

7 8 9

में एक ही उपयोग np.r_

A= [[1, 2, 3], [4, 5, 6]]
np.append(A, [[7, 8, 9]], axis=0)

    >> array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
#or 
np.r_[A,[[7,8,9]]]

यदि आप किसी कॉलम को जोड़ना चाहते हैं, तो किसी के इंटरस्टेड में,

array = np.c_[A,np.zeros(#A's row size)]

मैट्रिक्स ए पर हमने पहले क्या किया, इसके बाद एक कॉलम जोड़कर

np.c_[A, [2,8]]

>> array([[1, 2, 3, 2],
          [4, 5, 6, 8]])

10

आप यह भी कर सकते हैं:

newrow = [1,2,3]
A = numpy.concatenate((A,newrow))

2
हममम। जब मैंने यह कोशिश की, तो यह केवल ओ के अनुरोध के रूप में एक नई पंक्ति जोड़ने के बजाय, ए के अंत में जोड़ा गया।
टोड करी

13
शायदnp.concatenate((A,newrow), axis=0)
कोन्स्टैंटिनो रोडिटाकिस

3
जैसा कि एक खौफनाक संस्करण 1.12.1(और पायथन 3 में), यह ऐसा प्रतीत होता है जैसे एक वेक्टर को एक सदिश को बढ़ाने का प्रयास करता है ValueError: all the input arrays must have same number of dimensions। ऐसा लगता है कि यह चाहता है कि वेक्टर को एक कॉलम या पंक्ति वेक्टर में स्पष्ट रूप से फिर से आकार दिया जाए, इससे पहले कि वह इसे संक्षिप्त करने के लिए तैयार हो।
एमआरयूएल

3
@ नियम आप @Flora PJ Li stackoverflow.com/a/47845065/1410035 से उत्तर के अनुसार डबल वर्ग ब्रैकेट का उपयोग करके ठीक कर सकते हैं । newrow = [[1,2,3]]
टॉम सालेबा

10

यदि हर पंक्ति के बाद कोई गणना आवश्यक नहीं है, तो अजगर में पंक्तियों को जोड़ने के लिए बहुत तेज है, फिर संख्यात्मक रूप से परिवर्तित करें। यहां अजगर 3.6 बनाम संख्या 1.14 का उपयोग कर समय परीक्षण कर रहे हैं, एक समय में 100 पंक्तियों को जोड़ते हुए:

import numpy as np 
from time import perf_counter, sleep

def time_it():
    # Compare performance of two methods for adding rows to numpy array
    py_array = [[0, 1, 2], [0, 2, 0]]
    py_row = [4, 5, 6]
    numpy_array = np.array(py_array)
    numpy_row = np.array([4,5,6])
    n_loops = 100

    start_clock = perf_counter()
    for count in range(0, n_loops):
       numpy_array = np.vstack([numpy_array, numpy_row]) # 5.8 micros
    duration = perf_counter() - start_clock
    print('numpy 1.14 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))

    start_clock = perf_counter()
    for count in range(0, n_loops):
        py_array.append(py_row) # .15 micros
    numpy_array = np.array(py_array) # 43.9 micros       
    duration = perf_counter() - start_clock
    print('python 3.6 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
    sleep(15)

#time_it() prints:

numpy 1.14 takes 5.971 micros per row
python 3.6 takes 0.694 micros per row

तो, मूल प्रश्न का सरल समाधान, सात साल पहले से, पंक्ति को एक संख्यात्मक सरणी में बदलने के बाद एक नई पंक्ति जोड़ने के लिए vstack () का उपयोग करना है। लेकिन अधिक यथार्थवादी समाधान को उन परिस्थितियों में vstack के खराब प्रदर्शन पर विचार करना चाहिए। यदि आपको प्रत्येक जोड़ के बाद सरणी पर डेटा विश्लेषण चलाने की आवश्यकता नहीं है, तो नई पंक्तियों को एक पंक्तियों की अजगर सूची (सूची की सूची, वास्तव में) को बफर करना बेहतर है, और उन्हें एक समूह के रूप में जोड़ने के लिए पर्याप्त सरणी डेटा विश्लेषण करने से पहले vstack () का उपयोग करना।


5
import numpy as np
array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])

array_ = np.concatenate((array_, add_row), axis=0)

3

यदि आप एक ही ऑपरेशन में निर्माण कर सकते हैं, तो vstack-with-फैंसी-इंडेक्सिंग उत्तर की तरह कुछ एक अच्छा तरीका है। लेकिन अगर आपकी स्थिति अधिक जटिल है या आपकी पंक्तियाँ मक्खी पर आती हैं, तो आप सरणी बढ़ाना चाहते हैं। वास्तव में इस तरह से कुछ करने के लिए numpythonic तरीका - गतिशील रूप से एक सरणी विकसित करना - गतिशील रूप से एक सूची विकसित करना है:

A = np.array([[1,2,3],[4,5,6]])
Alist = [r for r in A]
for i in range(100):
    newrow = np.arange(3)+i
    if i%5:
        Alist.append(newrow)
A = np.array(Alist)
del Alist

इस तरह के एक्सेस पैटर्न के लिए सूचियाँ अत्यधिक अनुकूलित हैं; आपके पास सूची के रूप में सुविधाजनक सुपीरियर बहुआयामी अनुक्रमण नहीं है, लेकिन जब तक आप जोड़ रहे हैं तब तक पंक्ति सरणियों की सूची से बेहतर करना कठिन है।


3

मैं 'np.vstack' का उपयोग करता हूं जो तेज है, EX:

import numpy as np

input_array=np.array([1,2,3])
new_row= np.array([4,5,6])

new_array=np.vstack([input_array, new_row])

2

आप numpy.append()किसी पंक्ति को सरणी में सुन्न करने के लिए एक पंक्ति में जोड़ सकते हैं और बाद में किसी मैट्रिक्स पर फिर से सेट कर सकते हैं।

import numpy as np
a = np.array([1,2])
a = np.append(a, [3,4])
print a
# [1,2,3,4]
# in your example
A = [1,2]
for row in X:
    A = np.append(A, row)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.