为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMTTMM 2021-10-10 16:08:35
我是不是在概念上没有掌握某些东西(只有类似的问题),或者为什么沿第一个视图堆叠多个视图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 combinemview = 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是因为二维数组是单独的内存区域,结果数组不允许切片等吗?
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

All concatenate(stack只是另一种调用方式) 创建一个带有自己的数据缓冲区的数组。它永远不是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它生成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]: 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])

该ravel的mview不是一个子集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__检查数据缓冲区位置(其他定义属性):


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}


查看完整回答
反对 回复 2021-10-10
  • 1 回答
  • 0 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信