/ / flattern Sie eine große Liste von Listen, die Sie auf dem Weg freigeben - python, arrays, numpy, memory-management

Reduziere eine große Liste von Listen, entscheide dich auf dem Weg - python, arrays, numpy, memory-management

Ich habe eine Liste von m-durch-n NumPy-Arrays, die ich von einer Bibliothek eines Drittanbieters, z. B.

import numpy

x0 = numpy.random.rand(1000, 1000)  # x_i likewise
a =  [[x0], [x1, x2], [x3, x4, x5]]   # and more

Ich muss nun diese Struktur abflachen, z.

b = numpy.concatenate(a)
# b =  [x0, x1, x2, x3, x4, x5]

Die Arrays x sind jedoch so groß, dass beides a und b passen nicht gleichzeitig in die Erinnerung, also wird Python bei concatenate.

Kann ich flattern? a in ein zusammenhängendes numpy Array während die Zuweisung der Elemente von a nach dem Weg?

Antworten:

0 für die Antwort № 1

Damit a ist eine Liste von Listen von Arrays, in denen alle Arrays die gleiche Form haben?

concatenate nimmt eine Liste von Arrays und verbindet sie auf demgewünschte Achse. Es ist so kompiliert, dass es schwer ist zu sagen, was es mit den Listen von Listen etc. macht. Dieser Test zeigt, dass es sich verhält, als ob die Liste der Listen eine flache Liste wäre. Aber ich kann nicht sagen, ob es die Listen flacht oder verschachtelt verkettet.

In [339]: x0=np.ones((3,4),int)
In [340]: a=[[x0],[x0,x0],[x0,x0,x0]]
In [341]: np.concatenate(a)
In [342]: _.shape
Out[342]: (6, 3, 4)

Die verschachtelte Liste kann mit itertools abgeflacht werden

In [343]: import itertools
In [344]: b=list(itertools.chain(*a))

Da es sich um eine Listenoperation handelt, sollte sie die Speicherbelegung nicht stark beeinflussen, da sie nur mit Zeigern spielt und keine neuen Arrays erstellt.

Es kann möglich sein, Chunks zu verketten (subListen) und löscht Elemente aus den Listen. Damit dies jedoch effektiv ist, müssen wir sicherstellen, dass alle Verweise auf einzelne Arrays weg sind, andernfalls werden sie nicht als Müll gesammelt.

Aber ich werde nicht mit Arrays experimentieren, die mir Speicherfehler geben könnten.