2017-07-10 3 views
3

Je suis en train d'interfacer une bibliothèque C avec python. J'ai des tableaux en numpy que je passe à la bibliothèque en utilisant l'attribut ctypes du tableau.Application de la transposition en mémoire d'un tableau numpy

À un certain point, j'ai besoin de fournir un tableau à la bibliothèque C, qui devrait être la transposée du tableau numpy a que j'ai. (Une autre façon de le dire est que la bibliothèque C n'accepte pas une foulée pour la dimension la plus interne). Cependant, quand je passe a.T au lieu de a, rien ne se passe.

En effet, il semble que numpy fait une sorte de transposition paresseuse en échangeant simplement les progrès:

import ctypes 
import numpy as np 
a = np.zeros((2, 3)) 
a.ctypes.strides_as(ctypes.c_longlong)[:] 
# returns [24, 8] 
a.T.ctypes.strides_as(ctypes.c_longlong)[:] 
# return [8, 24] 

Ma question est, comment appliquer cette transposition se produire en mémoire?

EDIT

je remarquai que

a.T + np.zeros(a.T.shape) 

réordonne la mémoire comme je veux, mais s'il y a une solution plus élégante et explicite, je voudrais encore entendre.

(Aussi, il est intéressant,

a.T + np.zeros_like(a.T) 

semble pas mémoire de renumérotation).

+0

Avez-vous essayé [np.transpose] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html)? –

+0

Oui - même chose. – user1735003

Répondre

1

a.T, comme a.transpose(), affecte simplement l'en-tête et renvoie des vues. Vous pouvez les vérifier avec: a.T.flags.owndata, False.

Pour réellement transposer les données, la façon la plus simple de faire une copie: a=a.T.copy().

Il est plus difficile de le mettre en place. Vous pouvez le faire de cette façon:

a=np.arange(6).reshape(2,3).copy() 
print(a,a.flags,id(a),sep='\n') 

a.ravel()[:]=a.T.ravel() 
a.shape=a.T.shape 

print(a,a.flags,id(a),sep=('\n')) 

Sortie:

[[0 1 2] 
[3 4 5]] 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : False 
    OWNDATA : True 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 
221212538640 
[[0 3] 
[1 4] 
[2 5]] 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : False 
    OWNDATA : True 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 
221212538640 

Mais sans garantie, puisque vous écrivez sur les données que vous lisez. Il peut échouer sans avertissement sur les grands tableaux.

+0

L'explication de 'a.T' ne possédant pas les données est utile. – user1735003