Étant donné un tableau NumPy de int32
, comment puis-je le convertir float32
en place ? Donc en gros, j'aimerais faire
a = a.astype(numpy.float32)
sans copier le tableau. C'est gros.
La raison de cela est que j'ai deux algorithmes pour le calcul de a
. L'un d'eux renvoie un tableau de int32
, l'autre renvoie un tableau de float32
(et ceci est inhérent aux deux algorithmes différents). Tous les calculs ultérieurs supposent qu'il a
s'agit d'un tableau de float32
.
Actuellement, je fais la conversion dans une fonction C appelée via ctypes
. Existe-t-il un moyen de faire cela en Python?
ctypes
c'est autant "en Python" que utilisernumpy
. :)Réponses:
Vous pouvez créer une vue avec un dtype différent, puis la copier sur place dans la vue:
rendements
Pour montrer que la conversion était en place, notez que la copie de
x
vers a étéy
modifiéex
:impressions
la source
np.arange(10, dtype=np.int32).view(np.float32)
sur Numpy 1.8.2, j'obtiensarray([ 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 donne 10, plutôt que 20 float64x.astype(float)
conversion. Je ne le recommanderais pas à moins que votre script ne soit à la limite de MemoryError.Mise à jour: cette fonction évite uniquement la copie si elle le peut, ce n'est donc pas la bonne réponse à cette question. La réponse d'unutbu est la bonne.
numpy astype a un indicateur de copie. Pourquoi ne devrions-nous pas l'utiliser?
la source
Vous pouvez changer le type de tableau sans effectuer de conversion comme ceci:
mais vous devez d'abord changer tous les entiers en quelque chose qui sera interprété comme le flottant correspondant. Une manière très lente de le faire serait d'utiliser le
struct
module de python comme ceci:... appliqué à chaque membre de votre tableau.
Mais peut-être un moyen plus rapide serait d'utiliser les outils ctypeslib de numpy (avec lesquels je ne suis pas familier)
- Éditer -
Étant donné que ctypeslib ne semble pas fonctionner, je procéderais à la conversion avec la
numpy.astype
méthode typique , mais je procéderais avec des tailles de bloc qui sont dans les limites de votre mémoire:... puis changez le dtype une fois terminé.
Voici une fonction qui accomplit la tâche pour tous les dtypes compatibles (ne fonctionne que pour les dtypes avec des éléments de même taille) et gère les tableaux de forme arbitraire avec un contrôle utilisateur sur la taille des blocs:
la source
a.view(numpy.float32)
. Le plus dur est de convertir les données.numpy.ctypeslib
aide uniquement à réinterpréter les données, pas à les convertir réellement.utilisez view () et le paramètre 'dtype' pour changer le tableau en place.
la source
int
, cette réponse ne réinterpréterait que les données existantes sous un type différent, ce qui n'est pas ce que je demandais.dtype
,order
et lessubok
exigences de retourner une copie du tableau? Je ne le résous pas.Utilisez ceci:
la source
a = np.subtract(a, 0., dtype=np.float32)
la source
numpy.subtract
renvoie une copie, n'est-ce pas? Seul le noma
réutilisé pour un autre bloc de données ... Veuillez expliquer, si je me trompe à ce sujet.