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?
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
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
Hier ist meine Lösung:
arr = []
arr.append([1,2,3])
arr.append([4,5,6])
np_arr = np.array(arr)
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'])
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))
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