J'essaie d'écrire du code rapide et optimisé basé sur des matrices, et j'ai récemment découvert l'einsum comme un outil permettant une accélération significative.Façon rapide de définir les diagonales d'une matrice (M x N x N)? Einsum/n-dimensionnel fill_diagonal?
Est-il possible de l'utiliser pour définir efficacement les diagonales d'une matrice multidimensionnelle, ou peut-elle seulement renvoyer des données?
Dans mon problème, j'essaie de définir les diagonales pour un tableau de matrices carrées (forme: M x N x N) en sommant les colonnes dans chaque matrice carrée (N x N).
Ma solution actuelle (slow, boucle) est:
# Build dummy array
dimx = 2 # Dimension x (likely to be < 100)
dimy = 3 # Dimension y (likely to be between 2 and 10)
M = np.random.randint(low=1, high=9, size=[dimx, dimy, dimy])
# Blank the diagonals so we can see the intended effect
np.fill_diagonal(M[0], 0)
np.fill_diagonal(M[1], 0)
# Compute diagonals based on summing columns
diags = np.einsum('ijk->ik', M)
# Set the diagonal for each matrix
# THIS IS LOW. CAN IT BE IMPROVED?
for i in range(len(M)):
np.fill_diagonal(M[i], diags[i])
# Print result
M
peut-il être amélioré du tout s'il vous plaît? Il semble que np.fill_diagonal n'accepte pas les matrices non carrées (d'où la nécessité de forcer ma solution en boucle). Peut-être einsum peut-il aider ici aussi?
Merci. Cela fonctionne bien. Y a-t-il un autre moyen d'accélérer cela, pour éviter de faire de nombreuses remodelages? – PhysLQ
@PhysLQ Eh bien, remodeler pour créer une vue est la meilleure façon d'avoir un accès visualisé à un tableau et de le remodeler est virtuellement gratuit. Je ne vois pas d'autre utilisation de remodeler avec la méthode proposée, ou avons-nous besoin de remodeler ailleurs? – Divakar