Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

numpy.ndarray.data attribute buffer object

I create different numpy arrays as follows:

import numpy as np

a = np.array([[1,2,3],[1,2,3]])    # 2d array of integers
b = np.array([[1,2,3],[1,2,5.0]])  # 2d array of floats
c = np.array([1,2,3,4,5,6,7,8,9])  # 1d array of integers
d = np.array([10,20,30])           # different 1d array of integers


# python buffer object pointing to the start of the arrays data.
print(a.data)
print(b.data)
print(c.data)
print(d.data)

According to the numpy docs i expect to get a "python buffer object pointing to the start of the arrays data". Here is the official doc (from the numpy website): https://numpy.org/doc/stable/reference/generated/numpy.ndarray.data.html

So i would expect a different memory address for each array.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

but i get this:

<memory at 0x000001EAE8B7CAD0>
<memory at 0x000001EAE8B7CAD0>
<memory at 0x000001EAE98E8A00>
<memory at 0x000001EAE98E8A00>
  • The first two have the same memory buffer object pointer.
  • And the second two have the same memory buffer object pointer.

Is numpy inferring the memory buffer object pointer based on the dimension of the array or if not, what is the rule that generates similar pointer addresses ?

>Solution :

In an ipython session:

In [38]: type(a.data)
Out[38]: memoryview

and the docs for that object:

In [39]: a.data?
Type:        memoryview
String form: <memory at 0x000002AE38BAF5F0>
Length:      2
Docstring:   Create a new memoryview object which references the given object.

The print string of a memory view doesn’t tell us anything about the databuffer address.

It can be used to make a view of the the array:

In [45]: aa = np.ndarray(a.shape, a.dtype, buffer=a.data)    
In [46]: aa
Out[46]: 
array([[1, 2, 3],
       [1, 2, 3]])    
In [47]: aa.base is a
Out[47]: True

The data of __array_interface__ is closer to being a numeric address of the underlying data buffer. I don’t think it can be used in code, but I find it useful when checking whether an array is a view or copy:

In [48]: a.__array_interface__
Out[48]: 
{'data': (2947257325392, False),
 'strides': None,
 'descr': [('', '<i4')],
 'typestr': '<i4',
 'shape': (2, 3),
 'version': 3}
In [49]: aa.__array_interface__['data']
Out[49]: (2947257325392, False)
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading