3

Wenn ich versuche, mit mehr als 32 Dimensionen eine numpy Array zu erstellen, bekomme ich einen Fehler:numpy ndarray mit mehr als 32 Dimensionen

import numpy as np 

np.ndarray([1] * 33) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-2-78103e601d91> in <module>() 
----> 1 np.ndarray([1] * 33) 

ValueError: sequence too large; cannot be greater than 32 

ich diese gefunden: Using numpy.array with large number of dimensions auf diese Frage bezogen werden, aber ich möchte Mach das, ohne eine eigene Version zu erstellen.

Mein Anwendungsfall:
Ich arbeite mit Joint Probability Distributionen und ich versuche, jede Variable auf einer Achse darzustellen, so dass Berechnungen darauf (marginalisieren, reduzieren) eine einzeilige Operation ist. Zum Beispiel für eine Marginalisierungsoperation kann ich einfach eine Summe über die Achse dieser Variablen machen. Für die Multiplikation kann ich einfach eine einfache Multiplikation durchführen (nachdem überprüft wurde, ob die Achsen gleich sind).

Gibt es eine mögliche Abhilfe?

+0

Die Problemumgehung hängt von dem Anwendungsfall ab, nehme ich an. Möchten Sie mehr Hintergrundinformationen geben? –

+3

Sie sind sich bewusst, dass ein 32-dim-Array, selbst wenn es nur eine minimale Form von [2] * 32 und float32 dtype hat, 16 GB Speicher belegen würde? –

Antwort

1

Wie wäre es, die Daten in einem 1d gehalten wird, und selektiv auf eine bestimmte Dimension zu konzentrieren Umformung

Zur Veranschaulichung

In [252]: x=np.arange(2*3*4*5) 

Mit voller reshape

In [254]: x.reshape(2,3,4,5).sum(2) 
Out[254]: 
array([[[ 30, 34, 38, 42, 46], 
     [110, 114, 118, 122, 126], 
     [190, 194, 198, 202, 206]], 

     [[270, 274, 278, 282, 286], 
     [350, 354, 358, 362, 366], 
     [430, 434, 438, 442, 446]]]) 

Mit Teil reshape - same Zahlen, unterschiedliche Ergebnisform

In [255]: x.reshape(6,4,5).sum(1) 
Out[255]: 
array([[ 30, 34, 38, 42, 46], 
     [110, 114, 118, 122, 126], 
     [190, 194, 198, 202, 206], 
     [270, 274, 278, 282, 286], 
     [350, 354, 358, 362, 366], 
     [430, 434, 438, 442, 446]]) 

Ich werde das nicht auf etwas mehr als 32 Dimensionen testen. Wie in dem Kommentar angemerkt wurde, wird, wenn viele der Dimensionen größer als 1 sind, die gesamte Array-Größe übermäßig groß sein.

Verwandte Themen