python - Numpy - 两个一维数组的堆栈内存 View

标签 python numpy

我知道我可以做到以下几点:

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

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

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

我可以通过以下方式从 ab 创建 c:

c = np.c_[a, b]

但是,这会将 ab 的内存复制到 c 上。我能否以某种方式将 c 创建为 [a b] 的“ View ”,其中,通过修改 c 的元素,这反射(reflect)在相应的 ab 一维数组?

最佳答案

我认为这是不可能的。

在您的第一个示例中,ab View 的值交织在一起,从这个变体中可以看出:

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])

cadata 缓冲区从相同的内存点开始; 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),...}

即使 a,b 按行拆分,b 也会在同一个共享数据缓冲区中更远的地方开始。

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

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

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

关于python - Numpy - 两个一维数组的堆栈内存 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28518312/

相关文章:

带循环的 Python doctest

Windows 上的 Python-Django-WSGI-Apache - “ImportError: No module named site”

numpy - 在 Docker Alpine 上安装 seaborn

python - 如何从 Python 的邻接表中选择一个子矩阵?

python - 如果可能的话,如何使用函数参数作为 npy 方法

Python/Django UnicodeDecodeError 'ascii' 编解码器无法解码

python - 相当于 Python 或 MYSQL 中的 Excel Goal Seek 函数

python - 无效的 block 标记 : 'endblock' . 您是否忘记注册或加载此标记?

python - 大型二维掩码数组的插值

python - 以向量化方式计算数组切片上的函数