更正 - 使用正确的“数据”价值您的holder
作品np.array
:
np.array
绝对不会起作用,因为它需要一个可迭代的,例如列表列表之类的东西,并解析各个值。
有一个低级构造函数,np.ndarray
它接受一个缓冲区参数。和一个np.frombuffer
。
但我的印象是,它x.__array_interface__['data'][0]
是数据缓冲区位置的整数表示,而不是直接指向缓冲区的指针。我只用它来验证一个视图是否共享相同的数据缓冲区,而不是从中构造任何东西。
np.lib.stride_tricks.as_strided
用于__array_interface__
默认步幅和形状数据,但从数组而不是__array_interface__
字典中获取数据。
===========
ndarray
带有.data
属性的示例:
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])
这两个数组都是视图。
好的,在你的holder
课上,我可以做同样的事情,用它res.data
作为数据缓冲区。您的班级创建了一个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]])