gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:30:11 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com