我知道我可以做到以下几点:
import numpy as np
c = np.random.randn(20, 2)
a = c[:, 0]
b = c[:, 1]
这里,a
和b
分别是指向c
的第一列和第二列的指针。修改 a
或 b
将更改 c
(相互相同)。
然而,我想要实现的却恰恰相反。我想创建一个二维内存 View ,其中每一列(或行)将指向不同一维数组的内存。假设我已经有两个一维数组,是否可以为这些数组创建一个二维 View ,其中每一行/列都指向它们中的每一个?
我可以通过以下方式从 a
和 b
创建 c
:
c = np.c_[a, b]
但是,这会将 a
和 b
的内存复制到 c
上。我能否以某种方式将 c
创建为 [a b]
的“ View ”,其中,通过修改 c
的元素,这反射(reflect)在相应的 a
或 b
一维数组?
最佳答案
我认为这是不可能的。
在您的第一个示例中,a
和 b
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])
c
和a
的data
缓冲区从相同的内存点开始; 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
我们看到c
是C-contiguous
,b
不是。但是 b
值在该共享数据缓冲区中以恒定的步幅访问。
当 a
和 b
分别创建时,它们的数据缓冲区是完全独立的。 numpy
跨步机制不能在这两个数据缓冲区之间来回移动。 a
和 b
的二维组合必须使用其自己的数据缓冲区。
我可以想象编写一个最终看起来像您想要的类。定义 np.c_
的 indexing_tricks 文件可能会给您一些想法(例如,一个带有自定义 __getitem__
方法的类)。但它不会有常规二维数组的速度优势。而且可能很难实现所有 ndarray
功能。
关于python - Numpy - 两个一维数组的堆栈内存 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28518312/