84 votes

matrice/réseau 3d clairsemé en Python ?

En scipy, nous pouvons construire une matrice éparse en utilisant scipy.sparse.lil_matrix() etc. Mais la matrice est en 2d.

Je me demande s'il existe une structure de données pour les matrices / tableaux 3d éparses (tenseurs) en Python ?

p.s. J'ai beaucoup de données éparses en 3D et j'ai besoin d'un tenseur pour stocker / effectuer des multiplications. Avez-vous des suggestions pour implémenter un tel tenseur s'il n'y a pas de structure de données existante ?

0 votes

Cet article pourrait vous aider stackoverflow.com/questions/4490961/

0 votes

...mais pas épars, malheureusement.

0 votes

Qu'entendez-vous par "matrice en 2D" ? Si vous voulez dire une matrice représentant une transformation linéaire en 2D, alors vous parlez d'une matrice 2x2 de valeurs réelles (approximées par des valeurs à virgule flottante) avec un déterminant 1 pour une rotation rigide. Si vous voulez également représenter la translation, vous intégrez la matrice 2x2 dans une matrice 3x3, et si vous voulez permettre le cisaillement ou l'expansion/contraction, vous pouvez relâcher l'exigence du déterminant - mais même dans ce cas, cela représente un total de 9 valeurs à virgule flottante. Pourquoi voulez-vous/avez-vous besoin d'une représentation éparse ?

0voto

Sujit Vasanth Points 11

J'avais besoin d'une table de consultation en 3D pour x, y, z et j'ai trouvé cette solution
Pourquoi ne pas utiliser l'une des dimensions comme diviseur de la troisième dimension ? Par exemple, utiliser x et 'yz' comme dimensions de la matrice.

par exemple, si x a 80 membres potentiels, y a 100 membres potentiels' et z a 20 membres potentiels'. vous faites en sorte que la matrice éparse soit de 80 par 2000 (c'est-à-dire xy=100x20)
la dimension x est comme d'habitude
dimension yz : les 100 premiers éléments représenteront z=0, y=0 à 99
..............la seconde centaine représentera z=2, y=0 à 99, etc.
ainsi, un élément donné situé à (x,y,z) se trouverait dans la matrice éparse à (x, z*100 + y)
si vous avez besoin d'utiliser des nombres négatifs, concevez un décalage aritraire dans votre translation de matrice. la solution pourrait être étendue à n dimensions si nécessaire.

from scipy import sparse
m = sparse.lil_matrix((100,2000), dtype=float)

def add_element((x,y,z), element):
    element=float(element)
    m[x,y+z*100]=element

def get_element(x,y,z):
    return m[x,y+z*100]

add_element([3,2,4],2.2)
add_element([20,15,7], 1.2)
print get_element(0,0,0)
print get_element(3,2,4)
print get_element(20,15,7)
print "  This is m sparse:";print m

====================
OUTPUT:
0.0
2.2
1.2
  This is m sparse:
  (3, 402L) 2.2
  (20, 715L)    1.2
====================

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X