wake-up-neo.net

So fügen Sie einem leeren numpy-Array eine neue Zeile hinzu

Mit Standard-Python-Arrays kann ich Folgendes tun:

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

Ich kann jedoch nicht dasselbe tun. Zum Beispiel:

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]

Ich habe auch in vstack nachgesehen, aber wenn ich vstack in einem leeren Array verwende, bekomme ich:

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

Wie füge ich also in numpy eine neue Zeile an ein leeres Array an?

98
Tony Stark

So starten Sie das gewünschte Array:

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

Welches ist ein leeres Array, aber es hat die richtige Dimension.

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

Dann unbedingt entlang Achse 0 anhängen:

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

@Jonrsharpe hat aber recht. Wenn Sie in einer Schleife anhängen, ist es in der Tat viel schneller, an eine Liste als in dem ersten Beispiel anzuhängen und dann am Ende in ein numpy-Array zu konvertieren, da Sie wirklich nicht als numpy verwenden während der Schleife vorgesehen:

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

Die numpythonische Methode dafür hängt von Ihrer Anwendung ab, wäre jedoch eher wie folgt:

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
142
askewchan

In diesem Fall können Sie die Funktionen np.hstack und np.vstack verwenden

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]]

Sie können auch die Funktion np.concatenate verwenden.

Prost

21
mrcl

Hier ist meine Lösung:

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

mit einer benutzerdefinierten dtype-Definition funktionierte für mich Folgendes:

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
boclodoa

Ich möchte eine for-Schleife erstellen, aber mit der Methode von askewchan funktioniert sie nicht richtig. Deshalb habe ich sie geändert.

x=np.empty((0,3))
y=np.array([1 2 3])
for i in ...
x = vstack((x,y))
0
Qingdong Wang

Wenn Sie neue Zeilen für ein Array in Loop hinzufügen, weisen Sie das Array direkt zum ersten Mal in Loop zu, anstatt ein leeres Array zu initialisieren.

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

Dies ist vor allem nützlich, wenn die Form des Arrays unbekannt ist

0
Rajesh_Saladi