Suppose I have an __array_interface__
dictionary and I would like to create a numpy view of this data from the dictionary itself. For example:
buff = {'shape': (3, 3), 'data': (140546686381536, False), 'typestr': '<f8'}
view = np.array(buff, copy=False)
However, this does not work as np.array
searches for either the buffer or array interface as attributes. The simple workaround could be the following:
class numpy_holder(object):
pass
holder = numpy_holder()
holder.__array_interface__ = buff
view = np.array(holder, copy=False)
This seems a bit roundabout. Am I missing a straightforward way to do this?
__array_interface__ A dictionary of items (3 required and 5 optional). The optional keys in the dictionary have implied defaults if they are not provided. The keys are: shape (required) Tuple whose elements are the array size in each dimension.
Python numpy. zeros() function returns a new array of given shape and type, where the element's value as 0.
To create a three-dimensional array, we pass the object representing x by y by z in python, where x is the nested lists in the object, y is the nested lists inside the x nested lists, and z is the values inside each y nested list. The newly created three-dimensional array is stored in the variable called threedimarray.
correction - with the right 'data' value your holder
works in np.array
:
np.array
is definitely not going to work since it expects an iterable, some things like a list of lists, and parses the individual values.
There is a low level constructor, np.ndarray
that takes a buffer parameter. And a np.frombuffer
.
But my impression is that x.__array_interface__['data'][0]
is a integer representation of the data buffer location, but not directly a pointer to the buffer. I've only used it to verify that a view shares the same databuffer, not to construct anything from it.
np.lib.stride_tricks.as_strided
uses __array_interface__
for default stride and shape data, but gets the data from an array, not the __array_interface__
dictionary.
===========
An example of ndarray
with a .data
attribute:
In [303]: res
Out[303]:
array([[ 0, 20, 50, 30],
[ 0, 50, 50, 0],
[ 0, 0, 75, 25]])
In [304]: res.__array_interface__
Out[304]:
{'data': (178919136, False),
'descr': [('', '<i4')],
'shape': (3, 4),
'strides': None,
'typestr': '<i4',
'version': 3}
In [305]: res.data
Out[305]: <memory at 0xb13ef72c>
In [306]: np.ndarray(buffer=res.data, shape=(4,3),dtype=int)
Out[306]:
array([[ 0, 20, 50],
[30, 0, 50],
[50, 0, 0],
[ 0, 75, 25]])
In [324]: np.frombuffer(res.data,dtype=int)
Out[324]: array([ 0, 20, 50, 30, 0, 50, 50, 0, 0, 0, 75, 25])
Both of these arrays are views.
OK, with your holder
class, I can make the same thing, using this res.data
as the data buffer. Your class creates an object exposing the array interface
.
In [379]: holder=numpy_holder()
In [380]: buff={'data':res.data, 'shape':(4,3), 'typestr':'<i4'}
In [381]: holder.__array_interface__ = buff
In [382]: np.array(holder, copy=False)
Out[382]:
array([[ 0, 20, 50],
[30, 0, 50],
[50, 0, 0],
[ 0, 75, 25]])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With