Aplatissement du tableau numpy. J'ai essayé de savoir combien la différence de vitesse se produirait en fonction de la méthode de traitement. Le code s'exécute sur Jupyter.
reshape Le premier est le «remodelage» de base. Examinons la vitesse de traitement lors de la création d'un tableau 10000 x 10000 et de son aplatissement.
import numpy as np
np.random.seed(0)
a = np.random.randn(10**4, 10**4)
print(a)
production
[[ 1.76405235e+00 4.00157208e-01 9.78737984e-01 ... 5.16872179e-01
-3.29206931e-02 1.29811143e+00]
[-2.02117027e-01 -8.33231001e-01 1.73360025e+00 ... -5.72592527e-02
-1.05893126e+00 -3.26528442e-01]
[ 3.30045889e-01 -4.79979434e-04 8.18115898e-01 ... -1.51127631e+00
9.76843833e-01 1.25550065e+00]
...
Exécuter reshape
%%time
b = a.reshape(-1)
b[0] = 100.
print(b[:5], '\n')
print(a[0, :5], '\n')
production
[100. 0.40015721 0.97873798 2.2408932 1.86755799]
[100. 0.40015721 0.97873798 2.2408932 1.86755799]
CPU times: user 2 ms, sys: 0 ns, total: 2 ms
Wall time: 2.15 ms
Si vous utilisez la méthode reshape
telle quelle, elle sera passée par référence au tableau original ʻa` comme indiqué ci-dessus. Il est rapide sans avoir besoin de sécuriser une nouvelle zone mémoire. Cependant, sachez que la valeur de «a» changera également.
flatten
%%time
b = a.flatten()
b[0] = 100.
print(b[:5], '\n')
print(a[0, :5], '\n')
production
[100. 0.40015721 0.97873798 2.2408932 1.86755799]
[1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]
CPU times: user 152 ms, sys: 378 ms, total: 530 ms
Wall time: 532 ms
flatten
transmet une copie du tableau d'origine comme ci-dessus. Donc, changer la valeur de «b» ne change pas la valeur originale de «a». Cependant, la vitesse de traitement est assez différente en raison de l'allocation d'une nouvelle zone mémoire. Cela ne peut pas être dit sans condition, mais en regardant les résultats ci-dessus seuls, la vitesse de traitement est près de 250 fois plus rapide que "remodeler".
ravel
%%time
b = a.ravel()
b[0] = 100.
print(b[:5], '\n')
print(a[0, :5], '\n')
production
[100. 0.40015721 0.97873798 2.2408932 1.86755799]
[100. 0.40015721 0.97873798 2.2408932 1.86755799]
CPU times: user 2.75 ms, sys: 0 ns, total: 2.75 ms
Wall time: 3.36 ms
Comme «reshape», «ravel» est passé par référence et la vitesse de traitement est élevée.
resize
La méthode resize
est destructive. Donc, cela change l'objet lui-même appelé ʻa. De plus, contrairement à la méthode
reshape, même si la forme et le nombre de valeurs ne correspondent pas, elle passera à une bonne sans provoquer d'erreur. Dans l'exemple ci-dessous, vous pouvez voir que la valeur de ʻa
est régulièrement mise à jour.
a.resize(1, 10000*10000)
print(a[:5], '\n')
a.resize(2, 2)
print(a, '\n')
a.resize(3, 3)
print(a, '\n')
a.resize(1)
print(a)
production
[[ 1.76405235 0.40015721 0.97873798 ... 0.32191089 0.25199669
-1.22612391]]
[[1.76405235 0.40015721]
[0.97873798 2.2408932 ]]
[[1.76405235 0.40015721 0.97873798]
[2.2408932 0. 0. ]
[0. 0. 0. ]]
[1.76405235]
Si vous ne souhaitez pas modifier la valeur avant la conversion, écrivez comme suit.
%%time
b = np.resize(a, (-1, ))
b[0] = 100.
print(b[:5], '\n')
print(a[0, :5], '\n')
print(a.shape, '\n')
print(b.shape, '\n')
production
[100. 0.40015721 0.97873798 2.2408932 1.86755799]
[1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]
(10000, 10000)
(99999999,)
CPU times: user 235 ms, sys: 1.95 ms, total: 237 ms
Wall time: 239 ms
!?
ʻA n'a pas changé, mais si vous regardez de près, la valeur essentielle
best de un de moins. Apparemment, si vous spécifiez
(-1,)comme ci-dessus, le nombre de
redimensionner` sera réduit de un? C'est comme. Donc, quand vous voulez changer la taille, il semble que vous deviez spécifier explicitement la taille comme ʻa.resize (1, 10000 * 10000) ʻ dans la cellule quatre ci-dessus.
(Une addition)
** resize (-1)
semble être une spécification à l'exception de la dernière valeur spécifiée comme dans les commentaires sur ce blog.
c = np.arange(6).reshape(2, 3)
d = np.resize(c, (-1,))
print(c, '\n')
print(d)
production
[[0 1 2]
[3 4 5]]
[0 1 2 3 4]
Si vous voulez de la vitesse, remodelez. Si vous voulez en donner une copie, je pense personnellement que «aplatir» ne sera pas gênant pour le moment, mais je serais reconnaissant si quelqu'un familier avec ce domaine pouvait commenter.