我是不是在概念上没有掌握一些东西(只有类似的question),或者为什么沿着第一个axis=0
堆叠多个视图不会产生新的视图?问题是:多个2d数组中的一行应该合并成一个新的矩阵,这也是一个不增加内存使用的视图。示例:
recs = np.arange(2*2).reshape(2,2)
recs2 = np.arange(4,2*2*2).reshape(2,2)
print(recs)
print(recs2)
rv0 = recs[0].view()
r2v0 = recs2[0].view()
#now combine
mview = np.stack([rv0,r2v0], axis=0)
print(mview)
np.may_share_memory(mview,recs2)
印刷品
[[0 1]
[2 3]]
[[4 5]
[6 7]]
[[0 1]
[4 5]]
False #sure a copy
是不是因为二维数组是独立的内存区域,结果数组不允许切片等?你知道吗
所有
concatenate
(stack
只是调用它的另一种方式)用它自己的databuffer创建一个数组。它从来不是原作的view
。你知道吗你的
rv0
是一个数组(np.ndarray
),就像recs
,有自己的形状、数据类型和步幅。它只与recs
共享数据缓冲区。它可以被描述为recs
的“视图”,但在其他情况下,它与任何其他数组一样使用。它没有特别标记为view
类或对象。你知道吗因为
recs
是由arange
产生的数组的reshape
,所以它也是“视图”。这一点可以通过以下方式更加明显:可以说,我们可以用
ravel()
(它只生成一个1d视图)对databuffer进行快照:现在看看
stack
:mview
的ravel
不是Out[411]
和Out[412]
的子集。mview
必须有自己的连续数据缓冲区。没有任何机制可以使一个数组与2个或更多其他数组共享内存(除非它们也共享内存)。你知道吗即使是由同一数组的片组成的
stack
也有自己的数据缓冲区:我喜欢使用
__array_interface__
检查databuffer位置(其他定义属性):相关问题 更多 >
编程相关推荐