Pour ceux qui travaillent avec de grandes matrices, malloc / realloc pour les matrices est une question vitale. Les personnes maléfiques qui veulent recycler la mémoire devraient jeter un coup d'œil à cette courte feuille de triche.
Il peut arriver que vous souhaitiez remplir le tableau avec 0, par exemple au début d'une boucle. Utilisez numpy.ndarray.fill
pour remplir un tableau déjà alloué avec une certaine valeur.
import numpy as np
a = np.ones(5)
for i in range(5):
a.fill(0)
a[i] = 1
print(a)
Utilisez numpy.copyto
si vous souhaitez copier le contenu d'un tableau dans un autre tableau. Notez que numpy.copy
générera un nouveau tableau.
import numpy as np
m, n = 2000, 1000
A = np.ones((m, n))
B = np.zeros(A.shape)
#Une copie qui ne génère pas de nouveau tableau
np.copyto(B, A)
Si vous souhaitez sécuriser un grand tableau et le remplir dès le début avec un petit tableau, vous pouvez utiliser des tranches. Si vous voulez remplir la partie restante avec 0, utilisez le fill
ci-dessus pour le traiter.
import numpy as np
a = np.array([0, 1, 2, 3, 4])
b = np.array([5, 5, 5])
np.copyto(a[0:3], b) #Remplissez avec de petites valeurs de tableau depuis le début
a[3:5].fill(0) #Remplissez la partie restante avec 0
Pour les opérations mathématiques, la destination de stockage peut être spécifiée pour celles qui peuvent prendre ʻout` comme argument. Même si vous ne pouvez pas l'obtenir, il y a des moments où vous ne jouez pas avec la séquence elle-même.
Les opérations qui peuvent spécifier le paramètre de ʻout` dans Fonctions mathématiques utilisent la mémoire. La «forme» du réseau peut être différente tant qu'elle se trouve dans la plage que la diffusion peut gérer. Si la destination de l'affectation correspond à la matrice d'origine, vous pouvez utiliser un opérateur d'affectation tel que «+ =».
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[7, 8, 9],
[8, 7, 6]])
C = np.zeros(A.shape)
#Quatre règles d'opérations qui ne génèrent pas de nouveau tableau
np.add(A, B, out=C)
np.multiply(A, B, out=C)
np.subtract(A, B, out=C)
np.divide(A, B, out=C)
#Modèles utilisant des opérateurs d'affectation
A += B
A -= B
A *= B
A /= B
Notez que ʻA = A + B crée une nouvelle matrice et l'assigne à ʻA
.
Le transfert ne fait que jouer avec le paramètre appelé strides C'est rapide car la séquence elle-même n'est pas falsifiée.
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
#La translocation ne génère pas de nouvelle séquence
B = A.T
B[0,1] = 9
print(A)
output
array([[1, 2, 3],
[9, 5, 6]])
Bien que non présenté dans cet article, «remodeler» est également rapide car l'ordre de l'arrangement lui-même n'a pas changé.
Vous pouvez utiliser l'opérateur * =
.
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
A *= 5
Vous pouvez également spécifier ʻout pour
numpy.dot`.
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[7, 8, 9],
[8, 7, 6]])
C = np.zeros((2, 2))
#Produit matriciel qui ne génère pas de nouvelle baie
np.dot(A, B.T, out=C)
En passant, lors de la multiplication de plusieurs matrices, utilisez numpy.linalg.multi_dot
pour obtenir les produits de la matrice dans l'ordre le plus efficace. Cependant, ʻout` ne peut pas être spécifié ici.
Recommended Posts