La tupla di matrici è una raccolta di elementi adatti all'indicizzazione. L'output avrà la forma delle matrici di indicizzazione (o matrici) e ogni elemento nell'output verrà selezionato dall'array originale utilizzando il primo array come indice della prima dimensione, il secondo come indice della seconda dimensione, e così via. In altre parole, questo:
>>> numpy.where(M == 0)
(matrix([[0, 0, 4]]), matrix([[0, 2, 1]]))
>>> row, col = numpy.where(M == 0)
>>> M[row, col]
matrix([[0, 0, 0]])
>>> M[numpy.where(M == 0)] = 1000
>>> M
matrix([[1000, 1, 1000],
[ 4, 2, 4],
[ 3, 4, 1],
[ 1, 3, 2],
[ 2, 1000, 3]])
La sequenza potrebbe essere ciò che ti confonde. Procede in ordine appiattito - quindi M[0,2]
appare in secondo luogo, non terzo. Se avete bisogno di riordinare loro, si potrebbe fare questo:
>>> row[0,col.argsort()]
matrix([[0, 4, 0]])
È inoltre potrebbe essere meglio utilizzare le matrici invece di matrici. In questo modo puoi manipolare la forma degli array, che è spesso utile! Nota anche il trucco basato sulla trasposizione di ajcr, che è probabilmente preferibile all'utilizzo di argsort
.
Infine, c'è anche un metodo nonzero
che fa la stessa cosa di where
in questo caso. Utilizzando il trucco trasposta ora:
>>> (M == 0).T.nonzero()
(matrix([[0, 1, 2]]), matrix([[0, 4, 0]]))
Sì, hai ragione, usare la trasposizione è meglio di "argsort" qui. – senderle