2016-02-28 21 views
5

Chciałbym utworzyć macierz 3D o określonym rozmiarze, obliczając wartość dla każdej kombinacji indeksów. Każda wartość w macierzy będzie symboliczna.Wielowymiarowa macierz symboliczna w Pythonie

Co próbowałem do tej pory:

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 

To daje mi błąd:

TypeError: can't convert expression to float

który o ile mi zrozumieć, ze względu na łączenie numpy i sympy. Dlatego starałem:

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

zamiast:

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

i dostaje błąd:

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

Podsumowując, moje pytanie brzmi: w jaki sposób można utworzyć macierz 3D z wszelkie zmienne w środku, aby móc go użyć w zagnieżdżonej pętli, która obejmuje obliczenia symboliczne?

(Jest to mój pierwszy post w tej społeczności, więc proszę dać mi znać, jeśli nie zrobił nic złego.)

Odpowiedz

3

Pierwszy błąd dostać to, jak pan sugeruje, ponieważ próby zapisania obiektu sympy typu do tablicy zer zerowej, która jest typu numerycznego. Jedną z możliwości byłoby użyć numpy tablicę obiektów, które działa następująco,

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 

Mimo dużych rozmiarów nie jest to zbyt skuteczne i nie sposób numpy powinno działać. Dla tablic sympy może to być jedyna droga, jednak wydaje się, że przynajmniej w mojej wersji sympy (0.7.1.rc1) tablice 3D nie są obsługiwane. Dla

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

otrzymuję następujący błąd

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

SymPy ma typ matrycy. Jeśli tworzysz matrycę symboliczną, lepiej z niej korzystać. – asmeurer

+0

W rzeczywistości nie zauważyłem, że macierz jest 3D. W SymPy 1.0 będziesz mógł użyć 'sympy.tensor.array.Array'. – asmeurer