首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy reshape会创建副本吗?

numpy reshape会创建副本吗?
EN

Stack Overflow用户
提问于 2017-10-05 05:33:45
回答 1查看 10.1K关注 0票数 15

有没有一种方法可以对numpy数组进行重塑,而不是原地重塑。我的问题是我的数组非常大,所以任何不必要的副本都会使内存紧张。

我目前的方法是这样的:

代码语言:javascript
复制
train_x = train_x.reshape(n,32*32*3)

这并不能完全解决问题,因为它创建了一个新数组,然后将标签train_x属性赋给了新数组。

在正常情况下,这是可以的,因为垃圾收集器很快就会收集原始数组。

问题是我有这样的东西:

代码语言:javascript
复制
train_x, train_y = train_set
train_x = train_x.reshape(n,32*32*3)

因此,在这种情况下,即使train_x不再指向原始数组,在train_set内部仍然有一个指向原始数组的指针。

我想要一种将前一个数组的所有指针都指向这个新数组的方法。有什么办法吗?

或者,也许有其他方法来处理这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-05 06:06:14

对于Python,请记住几个变量或名称可以指向同一个对象,例如numpy数组。数组也可以有视图,视图是新的数组对象,但具有共享的数据缓冲区。副本有自己的数据缓冲区。

代码语言:javascript
复制
In [438]: x = np.arange(12)
In [439]: y = x                # same object
In [440]: y.shape = (2,6)      # inplace shape change
In [441]: y
Out[441]: 
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
In [442]: x
Out[442]: 
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
In [443]: y = y.reshape(3,4)        # y is a new view
In [444]: y
Out[444]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [445]: x
Out[445]: 
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])

y具有不同的形状,但共享数据缓冲区:

代码语言:javascript
复制
In [446]: y += 1
In [447]: y
Out[447]: 
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
In [448]: x
Out[448]: 
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12]])
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46574568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档