2017-02-25 1 views
0

Ich habe eine sehr große 6D-Array als (225, 97, 225, 32, 32, 32). Ich möchte es in 4D Array wie (225*97*225, 32, 32, 32) umformen. Ich habe versucht, Python 2.7 in Ubuntu 14.04 mit dem folgenden Code zu verwenden, aber ich habe den Speicherfehler. Wie könnte ich es lösen?Wie ein großes Array neu zu gestalten (Memory Error)

Dank
import numpy as np 

#input_6D shape (225, 97, 225, 32, 32, 32) 
input_4D= input_6D.reshape(input_6D.shape[0]*input_6D.shape[1]*input_6D.shape[2], input_6D[0],input_6D[1],input_6D[2]) 

Der Fehler ist

input_4D = input_6D.reshape (input_6D.shape [0] * input_6D.shape [1] * input_6D.shape [2], input_6D [0], input_6D [1], input_6D [2]) MemoryError

Dies ist Schritt, was ich getan habe. Zuerst lade ich einen 3D-Eingang mit Shape 256x128x256. Dann habe ich den Code unten 6D Array als (225, 97, 225, 32, 32, 32) zu bekommen, wo Patch Form ist 32, 32, 32

def patch_extract_3D(input,patch_shape): 
    patches_6D = np.lib.stride_tricks.as_strided(input, ((input.shape[0] - patch_shape[0] + 1) // xstep, (input.shape[1] - patch_shape[1] + 1) // ystep, 
                (input.shape[2] - patch_shape[2] + 1) // zstep, patch_shape[0], patch_shape[1], patch_shape[2]), 
                (input.strides[0] * xstep, input.strides[1] * ystep,input.strides[2] * zstep, input.strides[0], input.strides[1],input.strides[2])) 
+1

Bei dieser riesigen Datenmenge müssen Sie sie wahrscheinlich zuerst auf die Festplatte (Datei oder Datenbank) ausgeben und erneut lesen. –

+0

Haben Sie eine Lösung per Code zur Verfügung gestellt? Leider habe ich Ihre Lösung nicht vollständig erfasst. – user3051460

+0

Sind Sie sicher, dass Sie den gleichen Befehl ausführen, den Sie in der Frage angezeigt haben? Denn für mein Auge sieht es so aus, als käme man mit diesem Befehl nicht so weit wie MemoryError. Sie sollten etwas wie "nur Länge-1-Arrays können in Python-Skalare umgewandelt werden", weil Sie als Argumente umformen Dinge wie "input_6D [0]", die nicht Zahlen, sondern riesige Arrays selbst sind. – avysk

Antwort

0

Der strided Ausdruck mit xstep,ystep,zstep=1,1,1 arbeitet.

wenn der Eingang ist mit np.zeros((256,128,256),np.int8) Schritten (32768, 256, 1), wird die Ausgabe der gegebenen Form und schreitet (32768, 256, 1, 32768, 256, 1).

Ich berechne, dass die Schritte für das neu gestaltete Array (1426325504, 58982400, 262144, 1024, 32, 1) sein müssen.

Es gibt keine Möglichkeit, das ohne eine Kopie zu bekommen. as_strided erzeugt einen Blick auf das Original. Aber die Umformung wird eine Kopie machen, die etwa 200 mal größer ist.

mehr auf eine Kopie von einem as_strided Erstellen bei reshaping a view of a n-dimensional array without using reshape

Diese strided Ansicht mit einer Reduktionsoperation funktionieren könnte, wie beispielsweise den Mittelwert oder die Summe der letzten 3 Dimensionen nehmen. Tun Sie das zuerst und versuchen Sie dann, sich neu zu formen. as_strided ist schwierig, und doppelt so, wenn es auf 3 Dimensionen erfolgt.

How to recover 3D image from its patches in Python? - Ihre vorherige Frage zu diesem Schrittcode.

Verwandte Themen