What Is A Python Buffer Object Pointing To The Start Of The Array’s Data?
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) Running above code, I am surprised that print(A.data ==
Solution 1:
I prefer __array_interface__
as a way of looking at the attributes, including data buffer address:
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]
values do match
The documentation for A.data
is:
Python buffer object pointing to the start of the array’s data
but to ordinary Python programmers that can be misleading. @ajcr
's comment is better. There is a difference between 'buffer object' and the address of the arrays data buffer.
============
I haven't used the data
attribute much. One of the few cases has been to create an array using the ndarray
function
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
just prints its repr
, and is just as non-informative as:
In [808]: o=object()
In [809]: o
Out[809]: <object at 0xb729fc90>
Post a Comment for "What Is A Python Buffer Object Pointing To The Start Of The Array’s Data?"