Belki 12 farklı dizi değerine sahip bu örnek yardımcı olacaktır:
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
...
C order
Değerler onlar üretildi sırayla vardır. Aktarılmış olanlar değildir
In [212]: x.reshape(12,)
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])
Her ikisinin de 1d görünümünü alabilirsiniz
In [214]: x1=x.T
In [217]: x.shape=(12,)
şekli x
de değiştirilebilir.
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
Ancak devrik şekli değiştirilemez. data
Hala 0,1,2,3,4...
olarak erişilebilir erişilemiyor için, 0,4,8...
bir 1d dizi.
Ancak bir kopyası x1
değiştirilebilir:
In [227]: x2=x1.copy()
In [228]: x2.flags
Out[228]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
...
In [229]: x2.shape=(12,)
Bakmak strides
da yardımcı olabilir. Adımlar, bir sonraki değere ulaşmak için ne kadar uzağa (bayt cinsinden) ulaşması gerektiğidir. 2 boyutlu bir dizi için 2 adım değeri olacaktır:
In [233]: x=np.arange(12).reshape(3,4).copy()
In [234]: x.strides
Out[234]: (16, 4)
Sonraki satıra geçmek için, adım 16 bayt, yalnızca sonraki sütun 4.
In [235]: x1.strides
Out[235]: (4, 16)
Transpoze sadece adımların sırasını değiştirir. Bir sonraki satır sadece 4 bayttır - yani bir sonraki sayı.
In [236]: x.shape=(12,)
In [237]: x.strides
Out[237]: (4,)
Şekli değiştirmek aynı zamanda adımları da değiştirir - sadece bir seferde 4 bayt arabelleğe adım atın.
In [238]: x2=x1.copy()
In [239]: x2.strides
Out[239]: (12, 4)
Olsa x2
tıpkı görünüyor x1
, farklı bir sırayla değerlerle kendi veri tamponunu sahiptir. Bir sonraki sütun 4 bayt fazla iken, sonraki satır 12'dir (3 * 4).
In [240]: x2.shape=(12,)
In [241]: x2.strides
Out[241]: (4,)
Ve olduğu gibi x
, şekli 1d değiştirmek, adımların sayısını azaltır (4,)
.
Sıradaki x1
verilerle, 0,1,2,...
verebilecek 1d'lik bir adım yoktur.0,4,8...
.
__array_interface__
dizi bilgilerini görüntülemenin başka bir kullanışlı yoludur:
In [242]: x1.__array_interface__
Out[242]:
{'strides': (4, 16),
'typestr': '<i4',
'shape': (4, 3),
'version': 3,
'data': (163336056, False),
'descr': [('', '<i4')]}
x1
Veri ara bellek adresi için aynı olacaktırx
veriyi paylaştığı. x2
farklı bir tampon adresine sahiptir.
Ayrıca ve komutlarına bir order='F'
parametre eklemeyi deneyebilirsiniz .copy
reshape