Python PyArray_New或PyArray_SimpleNewFromData指定三维阵列的尺寸

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

我有一个一维浮点数组(来自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); 返回对象(数组); }
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情况?第一个参数是的初始值设定项列表(或/for
std::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)