通过沿一个轴堆叠,将两个小视图合并为一个视图

2024-10-04 03:20:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我是不是在概念上没有掌握一些东西(只有类似的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

是不是因为二维数组是独立的内存区域,结果数组不允许切片等?你知道吗


Tags: 内存view视图概念np数组printrecs
1条回答
网友
1楼 · 发布于 2024-10-04 03:20:22

所有concatenatestack只是调用它的另一种方式)用它自己的databuffer创建一个数组。它从来不是原作的view。你知道吗

你的rv0是一个数组(np.ndarray),就像recs,有自己的形状、数据类型和步幅。它只与recs共享数据缓冲区。它可以被描述为recs的“视图”,但在其他情况下,它与任何其他数组一样使用。它没有特别标记为view类或对象。你知道吗

In [409]: recs = np.arange(2*2).reshape(2,2)
     ...: recs2 = np.arange(4,2*2*2).reshape(2,2)

因为recs是由arange产生的数组的reshape,所以它也是“视图”。这一点可以通过以下方式更加明显:

temp = np.arange(2*2)
recs = temp.reshape(2,2)
np.may_share_memory(temp, recs)

可以说,我们可以用ravel()(它只生成一个1d视图)对databuffer进行快照:

In [411]: recs.ravel()
Out[411]: array([0, 1, 2, 3])
In [412]: recs2.ravel()
Out[412]: array([4, 5, 6, 7])

现在看看stack

In [414]: mview = np.stack([recs,recs2], axis=0)
In [415]: mview
Out[415]: 
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])
In [416]: mview.ravel()
Out[416]: array([0, 1, 2, 3, 4, 5, 6, 7])

mviewravel不是Out[411]Out[412]的子集。mview必须有自己的连续数据缓冲区。没有任何机制可以使一个数组与2个或更多其他数组共享内存(除非它们也共享内存)。你知道吗


即使是由同一数组的片组成的stack也有自己的数据缓冲区:

In [420]: x = np.stack((recs[0],recs[1]))
In [421]: x
Out[421]: 
array([[0, 1],
       [2, 3]])
In [422]: np.may_share_memory(recs, x)
Out[422]: False

我喜欢使用__array_interface__检查databuffer位置(其他定义属性):

In [423]: recs.__array_interface__
Out[423]: 
{'data': (37584304, False),
 'strides': None,
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (2, 2),
 'version': 3}

In [424]: x.__array_interface__
Out[424]: 
{'data': (37614336, False),
 'strides': None,
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (2, 2),
 'version': 3}

相关问题 更多 >