python - 通过沿一个轴堆叠将两个 numpy View 合并为一个 View

标签 python numpy view

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

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

是否因为二维数组是单独的内存区域并且生成的数组不允许切片等?

最佳答案

所有连接(stack只是调用它的另一种方式)创建一个具有自己的数据缓冲区的数组。它绝不是原始内容的 View

您的 rv0 是一个类似于 recs 的数组 (np.ndarray),具有自己的形状、数据类型和步幅。它只是与 recs 共享数据缓冲区。它可以被描述为 recs 的“ View ”,但除此之外它的使用方式与任何其他数组一样。它没有被专门标记为view类或对象。

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

由于 recs 是对 arange 生成的数组的reshape,因此它也是“ View ”。这可以通过以下方式变得更加明显:

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

我们可以使用 ravel() 获取数据缓冲区的快照(它只生成一维 View ):

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

现在看看堆栈:

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 个或更多其他数组共享内存(除非它们也共享内存)。

<小时/>

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

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}

关于python - 通过沿一个轴堆叠将两个 numpy View 合并为一个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54170606/

相关文章:

python - 从午夜以外的时间开始重新采样每日 Pandas 时间序列

python - 寻找特定区域的轮廓

python - Gensim 的 Doc2vec 中的 Index2word 引发属性错误

python - 我能否找出一个 numpy 向量是否显示为另一个向量的切片?

java - Android中如何让6个按钮调用不同参数的同一个方法?

python - 给定开始日期和结束日期,生成中间所有周的最有效方法是什么?

python - 如何从python numpy中的矩阵中获取 float

python - CUT 或 value_counts() 后分割成 Pandas bin 后返回某个值的 bin

javascript - 强制刷新 ember View

ruby-on-rails - Ruby on Rails 使用 View 助手中的变量在 View 中动态生成字段名称