En place ce type de conversion d'un tableau NumPy
Donné un tableau NumPy de int32
, comment puis-je convertir float32
en place? Donc en gros, je voudrais faire
a = a.astype(numpy.float32)
sans copier le tableau. Il est grand.
La raison pour cela est que j'ai deux algorithmes pour le calcul de a
. L'un d'eux retourne un tableau de int32
, l'autre renvoie un tableau de float32
(et c'est inhérent à ces deux algorithmes différents). Tous les autres calculs supposent que a
est un tableau de float32
.
Actuellement je fais la conversion en une fonction C appelé via ctypes
. Est-il un moyen de le faire en Python?
- À l'aide de
ctypes
est autant "Python" que l'utilisation denumpy
. 🙂 - Non, parce que je code et le compiler la fonction C moi-même.
- Oh, je vois. Je pense que vous êtes probablement SOL sur celui-ci.
- Naïve question: Comment pouvez-vous dire un=un.astype(numpy.float32) est de faire une copie? Python ralentit énormément et votre disque commence raclée?
- Il y a beaucoup de façons de dire si elle renvoie une copie. L'un d'eux est de lire le documentation.
- Que pensez-vous de l'aide a = np.cast['f'](a) avec
a
votreint32
tableau? - Cela ne veut pas effectuer une conversion. Il fait la même chose que le code dans la question d'origine. (Ne vous embêtez pas à essayer de le corriger -- il ne peut pas faire mieux que dans l'acceptation de réponse.)
- Pourquoi il n'est pas en place?
- C'est juste la façon dont les fonctions dans ce dictionnaire travail. Si j'avais poser la question "pourquoi ne
print
imprimer ses arguments?" ou "pourquoi nea + b
désigner la somme d'una
etb
?", comment voulez-vous répondre à ces questions? - Sur place signifie simplement "à l'aide de la même mémoire que le tableau d'origine". Jetez un oeil à la accepté de répondre -- la dernière partie montre que les nouvelles valeurs ont, en effet, écrasé à la même mémoire.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire un afficher avec un autre dtype, et ensuite de copier-lieu dans la vue:
rendements
Pour montrer la conversion était en place, notez que la copie de
x
ày
modifiéx
:imprime
np.arange(10, dtype=np.int32).view(np.float32)
sur Numpy 1.8.2, je reçoisarray([ 0.00000000e+00, 1.40129846e-45, ... [snip] ... 1.26116862e-44], dtype=float32)
.y[:] = x
.a = np.arange(10, dtype='float32'); b = a[::-1]; c = np.vstack((a,b)); d = c.view('float64')
Ce code prend 10 + 10 float32 et les résultats dans 10, au lieu de 20 float64x.astype(float)
de conversion. Je ne le recommande pas, sauf si votre script est limitrophe MemoryError.Mise à jour: Cette fonction permet uniquement d'éviter la copie s'il le peut, ce n'est donc pas la bonne réponse à cette question. unutbu réponse est la bonne.
numpy astype a une copie du pavillon. Pourquoi ne devrions-nous pas l'utiliser ?
import numpy as np; x = np.ones(int(1.9e9), dtype=np.int64); x.astype(np.float64, copy=False)
donne de l'erreur de mémoire sur une machine avec 16 Go de mémoire. Il peut encore créer des intermédiaires.Vous pouvez modifier le type du tableau sans avoir à les convertir comme ceci:
mais d'abord, vous devez changer tous les entiers de quelque chose qui va être interprété comme correspondant à flotteur. Un très lente façon de le faire serait d'utiliser python
struct
module comme ceci:...appliquée à chaque membre de votre groupe.
Mais peut-être un moyen plus rapide serait d'utiliser numpy est ctypeslib outils (dont je suis pas familier avec)
- edit -
Depuis ctypeslib n'a pas l'air de travailler, alors je voudrais procéder à la conversion avec la typique
numpy.astype
méthode, mais de procéder à des tailles de bloc à l'intérieur de vos limites de la mémoire:...puis changer le dtype lorsque vous avez terminé.
Voici une fonction qui accomplit la tâche pour tout compatible dtypes (ne fonctionne que pour les dtypes avec les mêmes éléments de taille) et les poignées de manière arbitraire en forme des tableaux avec de l'utilisateur-contrôle de la taille de bloc:
a.view(numpy.float32)
. La partie la plus difficile est en fait de la conversion des données.numpy.ctypeslib
seulement aident à réinterpréter les données, mais pas avec le fait de le convertir.utiliser la fonction afficher() et le paramètre 'dtype' pour changer le réseau en place.
int
, cette réponse serait seulement de réinterpréter les données existantes comme un type différent, ce qui n'est pas ce que je demandais.dtype
,order
, etsubok
exigences de retourner une copie de tableau? Je n'ai pas le résoudre.Utiliser ceci:
a = np.subtract(a, 0., dtype=np.float32)
numpy.subtract
est de retour une copie, n'est-ce pas? Seul le noma
réutilisé pour un autre bloc de données... s'il vous Plaît expliquer, si je me trompe à ce sujet.