ibeautiful
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]: mviewOut[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]: xOut[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}