给定一个字节缓冲区,dtype,shape和strides,如何创建Numpy ndarray

Alb*_*ert 7 python arrays buffer numpy multidimensional-array

我有缓冲,dtype,形状和步幅.我想创建一个Numpy ndarray,它重用缓冲区的内存.

numpy.frombuffer一个从缓冲区创建一个数组并重用内存.但是,我不确定我能否轻松安全地重塑它并设定步幅.

有一个numpy.ndarray构造函数可以引用缓冲区,但我不确定它是否会重用内存或它是否会复制它(文档中不清楚).

那么,numpy.ndarray构造函数会做我想要的吗?或者我可以使用什么呢?


好的,所以我现在想弄清楚自己numpy.ndarray构造函数到底在做什么.代码在这里.它用于PyArray_BufferConverter转换缓冲区参数.然后,它会调用PyArray_NewFromDescr_int由此可以看出这里.如果数据在那里传递,它将会fa->flags &= ~NPY_ARRAY_OWNDATA;.

MRo*_*lin 6

正如 @hpaulj 的评论中提到的,您可以使用 stride_tricks 模块来完成此操作。您需要np.frombuffernp.lib.stride_tricks.as_strided

从 NumPy 数组收集数据

In [1]: import numpy as np
In [2]: x = np.random.random((3, 4)).astype(dtype='f4')
In [3]: buffer = x.data
In [4]: dtype = x.dtype
In [5]: shape = x.shape
In [6]: strides = x.strides
Run Code Online (Sandbox Code Playgroud)

重新创建 NumPy 数组

In [7]: xx = np.frombuffer(buffer, dtype)
In [8]: xx = np.lib.stride_tricks.as_strided(xx, shape, strides)
Run Code Online (Sandbox Code Playgroud)

验证结果

In [9]: x
Out[9]: 
array([[ 0.75343359,  0.20676662,  0.83675659,  0.99904215],
       [ 0.37182721,  0.83846378,  0.6888299 ,  0.57195812],
       [ 0.39905572,  0.7258808 ,  0.88316005,  0.2187883 ]], dtype=float32)

In [10]: xx
Out[10]: 
array([[ 0.75343359,  0.20676662,  0.83675659,  0.99904215],
       [ 0.37182721,  0.83846378,  0.6888299 ,  0.57195812],
       [ 0.39905572,  0.7258808 ,  0.88316005,  0.2187883 ]], dtype=float32)

In [11]: x.strides
Out[11]: (16, 4)
In [12]: xx.strides
Out[12]: (16, 4)
Run Code Online (Sandbox Code Playgroud)