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
====================
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 ?
0 votes
@Peter "une matrice en 2D" signifie une matrice en 2 dimensions. Une unité dans une matrice en 2D peut être représentée par (x,y, r), où x et y sont les coordonnées et r est la valeur stockée en (x, y). J'ai besoin d'une représentation clairsemée parce que lorsque x & y sont très très grands, disons x<10^5, y < 10^4, ET seulement très peu de données sont stockées dans la matrice, disons 10^4. numpy fournit une matrice clairsemée pour la matrice 2d. Mais très souvent, nous avons besoin de 3d ou même n-d. Je pense que le cas n-d est trop général. Donc toute solution pour 3d est bonne pour moi.
0 votes
Merci - J'étais confus par le P.S. dans votre question (il m'a semblé que vous vouliez multiplier un tas de tuples euclidiens par une matrice, style algèbre linéaire). Mais si vous parlez de matrices m x n x o, alors il semble que votre implémentation "clairsemée" va devoir fournir une sorte d'interface d'itérateur afin que vous puissiez implémenter la multiplication (élément par élément).