Peut-être que cet exemple avec 12 valeurs de tableau différentes aidera:
In [207]: x=np.arange(12).reshape(3,4).copy()
In [208]: x.flags
Out[208]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
...
In [209]: x.T.flags
Out[209]:
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
...
Les C ordervaleurs sont dans l'ordre dans lequel elles ont été générées. Les valeurs transposées ne sont pas
In [212]: x.reshape(12,) # same as x.ravel()
Out[212]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In [213]: x.T.reshape(12,)
Out[213]: array([ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11])
Vous pouvez obtenir des vues 1d des deux
In [214]: x1=x.T
In [217]: x.shape=(12,)
la forme de xpeut également être modifiée.
In [220]: x1.shape=(12,)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-220-cf2b1a308253> in <module>()
----> 1 x1.shape=(12,)
AttributeError: incompatible shape for a non-contiguous array
Mais la forme de la transposition ne peut pas être modifiée. Le dataest toujours dans l' 0,1,2,3,4...ordre, qui n'est pas accessible comme 0,4,8...dans un tableau 1d.
Mais une copie de x1peut être modifiée:
In [227]: x2=x1.copy()
In [228]: x2.flags
Out[228]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
...
In [229]: x2.shape=(12,)
Regarder stridespeut également aider. Un pas est la distance (en octets) qu'il doit parcourir pour atteindre la valeur suivante. Pour un tableau 2D, il y aura 2 valeurs de foulée:
In [233]: x=np.arange(12).reshape(3,4).copy()
In [234]: x.strides
Out[234]: (16, 4)
Pour accéder à la ligne suivante, étape 16 octets, colonne suivante uniquement 4.
In [235]: x1.strides
Out[235]: (4, 16)
Transposer change simplement l'ordre des foulées. La ligne suivante ne fait que 4 octets, c'est-à-dire le numéro suivant.
In [236]: x.shape=(12,)
In [237]: x.strides
Out[237]: (4,)
Changer la forme change également les foulées - il suffit de parcourir le tampon 4 octets à la fois.
In [238]: x2=x1.copy()
In [239]: x2.strides
Out[239]: (12, 4)
Même s'il x2ressemble x1, il a son propre tampon de données, avec les valeurs dans un ordre différent. La colonne suivante a maintenant 4 octets au-dessus, tandis que la ligne suivante est 12 (3 * 4).
In [240]: x2.shape=(12,)
In [241]: x2.strides
Out[241]: (4,)
Et comme avec x , changer la forme en 1d réduit les foulées à (4,).
Pour x1, avec des données dans le0,1,2,... ordre, il n'y a pas de foulée 1d qui donnerait 0,4,8....
__array_interface__ est un autre moyen utile d'afficher les informations du tableau:
In [242]: x1.__array_interface__
Out[242]:
{'strides': (4, 16),
'typestr': '<i4',
'shape': (4, 3),
'version': 3,
'data': (163336056, False),
'descr': [('', '<i4')]}
L' x1adresse du tampon de données sera la même que pourx , avec laquelle il partage les données. x2a une adresse de tampon différente.
Vous pouvez également essayer d'ajouter un order='F'paramètre aux commandes copyet reshape.