2016-12-24 5 views
2
A = np.arange(12) 
B = A.reshape(3, 4) 
A[0] = 42 
print(B) 
print(A) 
print(np.may_share_memory(A, B)) 
print(A.data == B.data) 

上記のコードを実行すると、print(A.data == B.data)Falseを返します。 AとBはいくつかの記憶を共有しており、最初の要素は共有されているようです。次に、numpy.ndarray.dataが配列のデータの先頭を指しているオブジェクトである場合(ドキュメントが述べたように)、ABで同じ結果が得られることが期待されます。配列のデータの先頭を指すPythonバッファオブジェクトとは何ですか?

+1

'A.data == B.data'は、2つのPythonのmemoryviewオブジェクト(バフのないメモリアドレスを比較し、これらは形状/ストライド情報が異なるために不等である。 –

答えて

1

は、私がデータ・バッファ・アドレスを含む、属性を見ての方法として__array_interface__を好む:

In [766]: A = np.arange(12) 
In [767]: B = A.reshape(3,4) 
In [768]: A[0] = 42 
In [769]: A 
Out[769]: array([42, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) 
In [770]: B 
Out[770]: 
array([[42, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
In [771]: A.data 
Out[771]: <memory at 0xb16ef5dc> 
In [772]: B.data 
Out[772]: <memory at 0xb1719cdc> 
In [773]: A.__array_interface__ 
Out[773]: 
{'data': (156295616, False), 
'descr': [('', '<i4')], 
'shape': (12,), 
'strides': None, 
'typestr': '<i4', 
'version': 3} 
In [774]: B.__array_interface__ 
Out[774]: 
{'data': (156295616, False), 
'descr': [('', '<i4')], 
'shape': (3, 4), 
'strides': None, 
'typestr': '<i4', 
'version': 3} 

A.__array_interface__['data'][0]値はA.dataため

ドキュメントを一致させるんです。

Pythonのバッファ配列のデータの先頭を指すオブジェクト

しかし、誤解を招く恐れがある通常のPythonプログラマにとっては、 @ajcrさんのコメントが優れています。 「バッファオブジェクト」と配列データバッファのアドレスとの間には相違があります。私はあまりdata属性を使用していない

============

。いくつかの例の一つは、ndarray機能

how can I specify the memory address of a Numpy array using ctypes?

In [806]: np.ndarray((4,),buffer=A.data, dtype=int, offset=12) 
Out[806]: array([3, 4, 5, 6]) 
In [807]: np.ndarray((4,),buffer=B.data, dtype=int, offset=16) 
Out[807]: array([4, 5, 6, 7]) 

================

A.dataだけでプリントを使用してアレイを作成してきましたそのrepr、と同じように非有益であるとして:

In [808]: o=object() 
In [809]: o 
Out[809]: <object at 0xb729fc90> 
関連する問題