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 order
valeurs 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 x
peut é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 data
est 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 x1
peut ê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 strides
peut é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 x2
ressemble 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' x1
adresse du tampon de données sera la même que pourx
, avec laquelle il partage les données. x2
a une adresse de tampon différente.
Vous pouvez également essayer d'ajouter un order='F'
paramètre aux commandes copy
et reshape
.