Effectuer des opérations sur un tableau NumPy mais masquer les valeurs le long de la diagonale par rapport à ces opérations

StackOverflow https://stackoverflow.com/questions/1803860

  •  05-07-2019
  •  | 
  •  

Question

comme je peux effectuer des opérations sur des tableaux de sorte que cela ne fait rien sur la diagonale est calculé de telle sorte que tout sauf la diagonale

array ([[0.,  1.37, 1.,   1.37, 1.,   1.37, 1.]
       [1.37, 0. ,  1.37, 1.73, 2.37, 1.73, 1.37]
       [1. ,  1.37, 0. ,  1.37, 2. ,  2.37, 2. ]
       [1.37, 1.73, 1.37, 0. ,  1.37, 1.73, 2.37]
       [1. ,  2.37, 2. ,  1.37, 0. ,  1.37, 2. ]
       [1.37, 1.73, 2.37, 1.73, 1.37, 0. ,  1.37]
       [1. ,  1.37, 2. ,  2.37, 2. ,  1.37, 0. ]])

pour éviter la valeur NaN, mais conserve la valeur zéro sur la diagonale dans toutes les réponses

Était-ce utile?

La solution

Je me demande si des tableaux masqués pourraient faire ce que vous voulez, par exemple,

import numpy as NP
A = NP.random.random_integers(0, 9, 16).reshape(4, 4)
dg = NP.r_[ [NP.nan] * 4 ]  # proper syntax is 'nan' not 'NaN'
dg = NP.diag(dg)
A += dg                     # a 4x4 array w/ NaNs down the main diagonal
NP.sum(A, axis=1)           # doesn't work, gives: array([ NaN,  NaN,  NaN,  NaN])  
from numpy import ma as MA
Am = **MA.masked_invalid**(A)
NP.sum(Am, axis=1)         # now it works (treats 'nan' as 0)

L’autre façon de faire est bien sûr de convertir d’abord les NaN en 0 puis masquer les 0:

NP.nan_to_num(A)
MA.masked_equal(A, 0)

Enfin, il est souvent efficace de masquer et de convertir les NaN en une seule étape:

MA.fix_invalid(A)

Assez simple, gardez simplement à l'esprit que "ma" n'est peut-être pas encore dans votre espace de noms et que ces fonctions traitent de "NaNs" et "infs", qui correspond généralement à ce que vous souhaitez.

Autres conseils

>>> arr = [
... [0.,  1.37, 1.,   1.37, 1.,   1.37, 1.],
... [1.37, 0. ,  1.37, 1.73, 2.37, 1.73, 1.37],
... [1. ,  1.37, 0. ,  1.37, 2. ,  2.37, 2. ],
... [1.37, 1.73, 1.37, 0. ,  1.37, 1.73, 2.37],
... [1. ,  2.37, 2. ,  1.37, 0. ,  1.37, 2. ],
... [1.37, 1.73, 2.37, 1.73, 1.37, 0. ,  1.37],
... [1. ,  1.37, 2. ,  2.37, 2. ,  1.37, 0. ]
... ]
>>> for i in range(6):
...     for y in range(6):
...             if (i <> y):
...                     print arr[i][y]*arr[y][i]
...
1.8769
1.0
1.8769
1.0
1.8769
1.8769
1.8769
2.9929
5.6169
2.9929
1.0
1.8769
1.8769
4.0
5.6169
1.8769
2.9929
1.8769
1.8769
2.9929
1.0
5.6169
4.0
1.8769
1.8769
1.8769
2.9929
5.6169
2.9929
1.8769

Dépend de ce que vous devez calculer

Faites votre calcul normalement, puis

myarray[arange(len(array)), arange(len(array))] = 0.

Pouvez-vous faire le calcul normalement, puis ramener la diagonale à zéro?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top