Python PyArray_New或PyArray_SimpleNewFromData指定三维阵列的尺寸
我有一个一维浮点数组(来自C空间),我想在python空间中用零拷贝读取它。到目前为止,我所做的(主要是阅读)是: <代码> //包裹C++数组作为NUMPY数组 //马克斯http://stackoverflow.com/questions/10701514/how-to-return-numpy-array-from-boostpython boost::python::对象exposeNDarray(浮点*结果,长大小){ npy_intp shape[1]={size};//数组大小 PyObject*obj=PyArray\u SimpleNewFromData(1,形状,NPY\u浮点,结果); /*PyObject*obj=PyArray\u New(&PyArray\u Type,1,shape,NPY\u FLOAT,//数据类型 NULL,result,//数据指针 0,NPY\u数组\u CARRAY\u RO,//NPY\u数组\u CARRAY\u RO只读 无效)*/ 手柄阵列(obj); 返回对象(数组); }Python PyArray_New或PyArray_SimpleNewFromData指定三维阵列的尺寸,python,c++,c,numpy,Python,C++,C,Numpy,我有一个一维浮点数组(来自C空间),我想在python空间中用零拷贝读取它。到目前为止,我所做的(主要是阅读)是: //包裹C++数组作为NUMPY数组 //马克斯http://stackoverflow.com/questions/10701514/how-to-return-numpy-array-from-boostpython boost::python::对象exposeNDarray(浮点*结果,长大小){ npy_intp shape[1]={size};//数组大小 PyObj
PyArray\u New
注释部分在功能上等同于PyArray\u SimpleNewFromData
部分
我的问题是这个一维数组实际上应该是一个三维数组。我可以控制如何构造我的结果
浮点数组,如果可能的话,我希望将连续的内存块解释为三维数组
我认为这可以通过指定shape
变量来实现,但是,我找不到任何关于如何解释内存的参考
假设我需要数组看起来像:
np.empty((x,y,z))
。当我在shape
变量中指定时,我的结果
数组的哪个部分将构成第一个维度,第二个维度是哪个部分,依此类推?您可以使用它。实际上,您可以基于一个单元测试,作为numpy视图,有一些文档描述numpy阵列的布局,例如
但也许一个简单的例子会有所帮助
让我们制作一个由24个整数组成的一维数组,并将其重塑为三维形状。如果“重塑”没有意义,您需要回顾一些数组基础知识,包括视图
与复制
的概念
In [226]: arr = np.arange(24).reshape(2,3,4)
In [227]: arr
Out[227]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
查看此数组基本属性的一种简便方法是使用以下字典:
In [228]: arr.__array_interface__
Out[228]:
{'data': (159342384, False),
'descr': [('', '<i4')],
'shape': (2, 3, 4),
'strides': None,
'typestr': '<i4',
'version': 3}
descr
或arr.dtype
标识字节的解释方式-此处为4字节整数,'
形状
和步幅
确定如何查看1d阵列-在本例中为3d阵列
In [232]: arr.strides
Out[232]: (48, 16, 4)
In [233]: arr.shape
Out[233]: (2, 3, 4)
这表示第一个维度(平面)有48个字节长,其中有两个字节。第二行(每行)的长度为16字节,列元素之间的步长为4字节
通过简单地改变步幅和形状,可以将一维阵列视为二维、三维阵列。甚至数组转置也是通过改变
形状
和步幅
(以及另一个属性,顺序
)来实现的 除非我遗漏了什么,否则这是一个简单的1D情况?第一个参数是的初始值设定项列表(或/forstd::vector
)。可以为同一连续内存阵列指定另一个形状
In [229]: arr.tostring()
Out[229]: b'\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00\r\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x14\x00\x00\x00\x15\x00\x00\x00\x16\x00\x00\x00\x17\x00\x00\x00'
In [230]: len(_)
Out[230]: 96
In [231]: 24*4
In [232]: arr.strides
Out[232]: (48, 16, 4)
In [233]: arr.shape
Out[233]: (2, 3, 4)