0

numpy 配列が与えられたとします

x = np.array([[1,2],[3,4]], dtype=np.int8)

その転置を取りましょう。

y = x.T

numpy ドキュメントからの私の理解では、転置は配列のストライドのみを変更し、その基になるデータ バッファーは変更しないということです。

実行することで確認できます

>> x.data.strides
(2, 1)

>> y.data.strides
(1, 2)

ただし、データも変更されているようです

>> x.data.tobytes()
b'\x01\x02\x03\x04'

>> y.data.tobytes()
b'\x01\x03\x02\x04'

私の理解によると予想される動作は、yのデータ バッファは のデータ バッファと同じままでx、ストライドのみが変化するはずです。

のデータ バッファが異なるのはなぜyですか? data基になるメモリ レイアウトが属性に表示されていない可能性がありますか?

4

2 に答える 2

3

データ バッファーを確認するより良い方法は、__array_interface__ポインターを使用することです。

In [8]: y=x.T
In [9]: x.__array_interface__
Out[9]: 
{'strides': None,
 'data': (144597512, False),
 'shape': (2, 2),
 'version': 3,
 'typestr': '|i1',
 'descr': [('', '|i1')]}
In [10]: y.__array_interface__
Out[10]: 
{'strides': (1, 2),
 'data': (144597512, False),
 'shape': (2, 2),
 'version': 3,
 'typestr': '|i1',
 'descr': [('', '|i1')]}

ドキュメント.dataは次のとおりです。

[12]: x.data? 指定されたオブジェクトを参照する新しい memoryview オブジェクトを作成します。

In [13]: x.data
Out[13]: <memory at 0xb2f7cb6c>
In [14]: y.data
Out[14]: <memory at 0xb2f7cbe4>

y.dataそのため、バッファのバイトは表示されませんが、ストライドによってトラバースされたバイトは表示されます。データバッファを見る方法があるかどうかはyわかりません。

In [25]: y.base
Out[25]: 
array([[1, 2],
       [3, 4]], dtype=int8)

xCContiguousyは Fcontiguous です。

于 2016-03-18T07:07:25.377 に答える