11
votes

Élément-sage maximum de deux matrices clairsemées

Y a-t-il un moyen simple / intégré d'obtenir le maximum d'éléments de deux (ou idéalement plus) de matrices clairsemées? C'est à dire. un équivalent rare de NP.MAXimum .


2 commentaires

Que voulez-vous dire par « élément par élément »? Si je vais à la page coo_matrix clairsemée Je vois des fonctions comme arcsin () arcsin élément par élément. Mais pas max . Voulez-vous la plus grande valeur dans chaque matrice; plus long une dimension; le plus grand dans l'ensemble des matrices?


Aucune infraction, mais je pense sage-élément est assez ambigu. Dans: Deux matrices A, B avec les mêmes dimensions. Out: une matrice C Où c [i, j] = max (a [i, j], b [i, j]))


6 Réponses :


0
votes
from scipy import sparse
from numpy import array
I = array([0,3,1,0])
J = array([0,3,1,2])
V = array([4,5,7,9])
A = sparse.coo_matrix((V,(I,J)),shape=(4,4))

A.data.max()
9
If you haven't already, you should try out ipython, you could have saved your self time my making your spare matrix A then simply typing A. then tab, this will print a list of methods that you can call on A. From this you would see A.data gives you the non-zero entries as an array and hence you just want the maximum of this.

4 commentaires

Merci pour votre réponse, mais vous avez mal compris la question. Je l'ai édité pour le rendre plus clair.


Par élément sage, vous voulez dire, de matrice A et B qui a le plus grand élément maximum?


Ensuite, à moins que votre tableau soit extrêmement volumineux, je les converties simplement en matrices d'A.Tearray () 'et utilisez cette méthode. S'ils sont extrêmement grands et que cela brise votre ordinateur, je n'ai aucune idée désolée.


Cette réponse ne fonctionne pas pour obtenir l'élément-sage max de deux maxes, et même pour le max d'une matrice, il est incorrect: que si le max de .Data est négatif?



2
votes

Non, il n'y a pas de place intégrée pour le faire dans sciped.sparse . La solution Easy est xxx

mais cela va évidemment être très intensive de mémoire lorsque les matrices ont de grandes dimensions et cela pourrait planter votre machine. Une solution à effet de mémoire (mais à aucun moyen rapide) est xxx

Notez que cela utilise python pur au lieu d'idiomes vectorisés. Vous pouvez essayer de raser une partie du temps d'exécution en vectorisant des parties de celui-ci.


1 commentaires

J'aurais peut-être dû mentionner que j'ai essayé cela auparavant et cela s'est écrasé mon MacBook, car je n'avais pas assez d'espace disque pour le fichier d'échange.



5
votes

Ceci a fait l'astuce: xxx


1 commentaires

Contre-échantillon: A = coo_matrix ([1,1]); B = coo_matrix ([0,2]); maximum (a, b) .a donne tableau ([[0, 2]]) .



1
votes

Voici une autre solution efficace de la mémoire qui devrait être un peu plus rapide que les larsmans ». Il est basé sur la recherche de l'ensemble d'indices uniques pour les éléments non nulles dans les deux tableaux utilisant le code de Excellente réponse de Jaime ici . < Pré> xxx

test: xxx


1 commentaires

Ah, oubliez-la - la solution de Maarten est de nombreuses ordres de grandeur plus rapides que la mienne!



1
votes

Le dernier SCIPY (13.0) définit les booléens d'élément-sage pour des matrices clairsemés. Donc: xxx

np.maximum ne fonctionne pas (encore) car il utilise np.where , qui essaie toujours d'obtenir le valeur de vérité d'un tableau .

curieusement b> a retourne un dttype booléen, tandis que b> = A est float64 .


3 commentaires

Trop mal écris 13.0 n'est pas encore en PYPI.


Je ne suis pas sûr de ce que B> = A fait. Mais si cela ferait ce que vous feriez, si vous avez deux matrices très rares A et B, vous obtiendrez une matrice très dense en conséquence.


Bon point. Il explique l'avertissement que je reçois: "SPARSEFFUNCIning: comparer des matrices clairsemées à l'aide de> = et <= est inefficace, essayez d'utiliser <,> ou! =, À la place."



1
votes

Voici une fonction qui renvoie une matrice rare qui est un maximum de deux matrices clairsemées. Il met en œuvre la réponse par HPaulj : xxx pré>

test: p>

A = sparse.csr_matrix(np.random.randint(-9,10, 25).reshape((5,5))) 
B = sparse.csr_matrix(np.random.randint(-9,10, 25).reshape((5,5)))

M = sparse_max(A, B)
M2 = sparse_max(B, A)

# Test symmetry:
print((M.A == M2.A).all())
# Test that M is larger or equal to A and B, element-wise:
print((M.A >= A.A).all())
print((M.A >= B.A).all())


0 commentaires