2016-02-28 16 views
5

Vorrei creare una matrice 3D di dimensioni specifiche calcolando un valore per ciascuna combinazione di indici. Ogni valore nella matrice sarà simbolico.Matrice simbolica multidimensionale in Python

Quello che ho cercato fino ad oggi:

import numpy as np 
import sympy as sp 

var1 = np.arange(1,10,2) 
var2 = np.arange(1,10,2) 
var3 = np.arange(20,50,5) 

myMatrix = np.zeros(shape = (len(var1), len(var2), len(var3))) 
t = sp.symbols('t') 

for ii in range(len(var1)): 
    for jj in range(len(var2)): 
     for kk in range(len(var3)): 
      myMatrix[ii][jj][kk] = var1[ii] * var2[jj] * var3[kk] * t 

Questo mi dà l'errore:

TypeError: can't convert expression to float

che, per quanto ho capito è dovuto alla combinazione di NumPy e sympy. Pertanto, ho provato:

myMatrix = sp.MatrixSymbol('temp', len(var1), len(var2), len(var3)) 

invece di:

myMatrix = np.zeros(shape = (len(var1), len(var2), len(var3))) 

e ottenuto un errore:

TypeError: new() takes exactly 4 arguments (5 given)

In sintesi, la mia domanda è: come posso creare una matrice 3D con qualsiasi variabile all'interno di essere in grado di usarlo nel ciclo annidato, che comporta il calcolo simbolico?

(Questo è il mio primo post in questa comunità, quindi per favore fatemi sapere se ho fatto qualcosa di sbagliato.)

risposta

3

Il primo errore che si ottiene è, come lei ha suggerito, perché si tenta di salvare un oggetto sympy tipo in un array di zeri numpy che è di tipo numeri. Una possibilità sarebbe quella di utilizzare un numpy array di oggetti, che funziona come segue,

import numpy as np 
import sympy as sp 

var1 = np.arange(1,10,2) 
var2 = np.arange(1,10,2) 
var3 = np.arange(20,50,5) 

myMatrix = np.empty((len(var1), len(var2), len(var3)), dtype=object) 
t = sp.symbols('t') 

for ii in range(len(var1)): 
    for jj in range(len(var2)): 
     for kk in range(len(var3)): 
      myMatrix[ii][jj][kk] = var1[ii] * var2[jj] * var3[kk] * t 

Anche se per grandi formati questo non è troppo efficiente e non il modo NumPy dovrebbe funzionare. Per gli array sympy questo potrebbe essere l'unico modo per andare comunque, poiché sembra che, almeno nella mia versione di sympy (0.7.1.rc1), gli array 3D non siano supportati. Per

myMatrix = sp.zeros((len(var1), len(var2), len(var3))) 

ottengo il seguente errore

ValueError: Matrix dimensions should be a two-element tuple of ints or a single int! 
+0

SymPy ha un tipo di matrice. Se stai creando una matrice simbolica, è meglio usarla. – asmeurer

+0

In realtà, non ho notato che la matrice è 3D. In SymPy 1.0 sarai in grado di usare 'sympy.tensor.array.Array'. – asmeurer

Problemi correlati