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

我是不是在概念上没有掌握某些东西(只有类似的问题),或者为什么沿第一个视图堆叠多个视图axis=0不会产生新视图?问题:多个二维数组,其中单行应该组合成一个新矩阵,这也是一个不增加内存使用的视图。例子:


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

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


MMTTMM
浏览 221回答 1
1回答

ibeautiful

All concatenate(stack只是另一种调用方式) 创建一个带有自己的数据缓冲区的数组。它永远不是view原始的。您rv0是一个np.ndarray类似的数组 ( ) recs,具有自己的形状、数据类型和步幅。它只是与recs. 它可以被描述为 的“视图” recs,但除此之外,它的使用方式与任何其他数组一样。它没有特别标记为view类或对象。In [409]: recs = np.arange(2*2).reshape(2,2)&nbsp; &nbsp; &nbsp;...: recs2 = np.arange(4,2*2*2).reshape(2,2)由于recs它生成reshape的数组arange的 a 也是“视图”。这可以通过以下方式变得更加明显:temp = np.arange(2*2)recs = temp.reshape(2,2)np.may_share_memory(temp, recs)可以这么说,我们可以获得数据缓冲区的快照ravel()(仅生成一维视图):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]: mviewOut[415]:&nbsp;array([[[0, 1],&nbsp; &nbsp; &nbsp; &nbsp; [2, 3]],&nbsp; &nbsp; &nbsp; &nbsp;[[4, 5],&nbsp; &nbsp; &nbsp; &nbsp; [6, 7]]])In [416]: mview.ravel()Out[416]: array([0, 1, 2, 3, 4, 5, 6, 7])该ravel的mview不是一个子集Out[411]和Out[412]。 mview必须有自己的连续数据缓冲区。没有机制可以创建与 2 个或更多其他数组共享内存的数组(除非它们也共享内存)。即使是stack由同一数组的切片制成的,也有自己的数据缓冲区:In [420]: x = np.stack((recs[0],recs[1]))In [421]: xOut[421]:&nbsp;array([[0, 1],&nbsp; &nbsp; &nbsp; &nbsp;[2, 3]])In [422]: np.may_share_memory(recs, x)Out[422]: False我喜欢用来__array_interface__检查数据缓冲区位置(其他定义属性):In [423]: recs.__array_interface__Out[423]:&nbsp;{'data': (37584304, False),&nbsp;'strides': None,&nbsp;'descr': [('', '<i8')],&nbsp;'typestr': '<i8',&nbsp;'shape': (2, 2),&nbsp;'version': 3}In [424]: x.__array_interface__Out[424]:&nbsp;{'data': (37614336, False),&nbsp;'strides': None,&nbsp;'descr': [('', '<i8')],&nbsp;'typestr': '<i8',&nbsp;'shape': (2, 2),&nbsp;'version': 3}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python