[PYTHON] J'ai vérifié la vitesse de traitement de la numpy unidimensionnelle

Motivation pour bloguer

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 deredimensionner` 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]

Épilogue

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.

Recommended Posts

J'ai vérifié la vitesse de traitement de la numpy unidimensionnelle
J'ai vérifié le contenu du volume du docker
J'ai vérifié les options de copyMakeBorder d'OpenCV
À propos de la vitesse de traitement de SVM (SVC) de scikit-learn
J'ai vérifié la liste des touches de raccourci de Jupyter
J'ai vérifié la période de rétention de session de django
J'ai vérifié les spécifications de sortie du LSTM bidirectionnel de PyTorch
J'ai vérifié les versions de Blender et Python
J'ai vérifié le système d'exploitation et le shell par défaut de docker-machine
python3 Mesurez la vitesse de traitement.
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Comment augmenter la vitesse de traitement de l'acquisition de la position des sommets
Je veux déterminer l'authenticité d'un élément du tableau numpy
J'ai écrit le fonctionnement de base de Numpy dans Jupyter Lab.
J'ai étudié le mécanisme de connexion flask!
J'ai vérifié le montant de la taxe sur les cadeaux
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
J'ai vérifié l'état d'utilisation du parking à partir d'images satellite.
J'ai vérifié l'image de l'Université des sciences sur Twitter avec Word2Vec.
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
La structure des dossiers de Flask est résumée
J'ai essayé de résoudre 100 traitements linguistiques Knock version 2020 [Chapitre 3: Expressions régulières 25-29]
Résumé des fonctions numpy que je ne connaissais pas
Le modèle de projet Python auquel je pense.
J'ai vérifié le nombre de magasins fermés et ouverts dans tout le pays par Corona
L'histoire du traitement A du blackjack (python)
J'ai mesuré la vitesse de la notation d'inclusion de liste, pendant et pendant avec python2.7.
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
J'ai comparé la vitesse de l'écho du framework web en langage go et du flask du framework web python
J'ai comparé la vitesse des expressions régulières en Ruby, Python et Perl (version 2013)
J'ai essayé de résoudre la version 2020 de 100 coups de traitement de langue [Chapitre 1: Mouvement préparatoire 00-04]
J'ai essayé de résoudre la version 2020 de 100 traitements linguistiques [Chapitre 1: Mouvement préparatoire 05-09]
J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai recherché dans la bibliothèque l'utilisation de l'API Gracenote
J'ai essayé l'analyse par grappes de la carte météo
J'ai lu l'implémentation de range (Objects / rangeobject.c)
J'ai résolu le problème le plus profond d'Hiroshi Yuki.
Afficher le résultat du traitement de la géométrie en Python
J'ai essayé de corriger la forme trapézoïdale de l'image
Comparez la vitesse d'ajout et de carte Python
Traitement d'image? L'histoire du démarrage de Python pour
La forme du tableau unidimensionnel de numpy était compliquée
J'ai touché certaines des nouvelles fonctionnalités de Python 3.8 ①
[Python numpy] Spécifiez dynamiquement l'index du tableau
Vitesse de calcul de l'indexation pour un tableau quadratique numpy
J'ai lu et implémenté les variantes de UKR
À propos du comportement de la file d'attente pendant le traitement parallèle
Je souhaite personnaliser l'apparence de zabbix
J'ai vérifié le calendrier supprimé dans le calendrier de l'Avent Qiita 2016
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai vérifié la vitesse de référence lors de l'utilisation de la liste python, du dictionnaire et du type de jeu.
J'ai comparé la vitesse de la référence du python dans la liste et la référence de l'inclusion du dictionnaire faite à partir de la liste dans.
[Recette du formateur] J'ai touché le flacon du framework Python.
Je veux grep le résultat de l'exécution de strace
J'ai essayé de résumer la forme de base de GPLVM