Numpy - 两个一维数组的堆栈内存视图

Ima*_*ngo 5 python numpy

我知道我可以执行以下操作:

import numpy as np
c = np.random.randn(20, 2)
a = c[:, 0]
b = c[:, 1]
Run Code Online (Sandbox Code Playgroud)

这里,a和分别是指向 的第一列和第二列的b指针。c修改ab将要改变c(相互相同)。

然而,我想要达到的目标却恰恰相反。我想创建一个 2D 内存视图,其中每列(或行)将指向不同的 1D 数组的内存。假设我已经有两个一维数组,是否可以为这些数组创建一个二维视图,其中每行/列都指向它们中的每一个?

我可以c通过以下方式a创建:b

c = np.c_[a, b]
Run Code Online (Sandbox Code Playgroud)

然而,这会将ab内存复制到c. 我可以通过修改反映在相应数组或一维数组中的元素来以某种方式创建 的c“视图”吗?[a b]cab

hpa*_*ulj 5

我认为这是不可能的。

a在第一个示例中,和视图的值b是交织在一起的,从这个变体可以看出:

In [51]: c=np.arange(10).reshape(5,2)
In [52]: a, b = c[:,0], c[:,1]
In [53]: a
Out[53]: array([0, 2, 4, 6, 8])
In [54]: c.flatten()
Out[54]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)

dataforc和start 的缓冲区a在同一个内存点;b从该缓冲区的 4 个字节开始。

In [55]: c.__array_interface__
Out[55]: 
{'strides': None,
 'data': (172552624, False),...}

In [56]: a.__array_interface__
Out[56]: 
{'strides': (8,),
 'data': (172552624, False),...}

In [57]: b.__array_interface__
Out[57]: 
{'strides': (8,),
 'data': (172552628, False),...}
Run Code Online (Sandbox Code Playgroud)

即使a,b按行分割,b也会在同一个共享数据缓冲区中进一步开始。

.flags我们看到的cC-contiguousb不是。但b在共享数据缓冲区中以恒定的步幅访问值。

ab分别创建时,它们的数据缓冲区是完全独立的。跨步机制numpy无法在这两个数据缓冲区之间来回移动。a和的二维复合材料b必须使用其自己的数据缓冲区。

我可以想象编写一个最终看起来像你想要的那样的类。定义的indexing_tricks 文件np.c_可能会给您一些想法(例如具有自定义方法的类__getitem__)。但它不具备常规二维数组的速度优势。并且可能很难实现所有功能ndarray