Numpy重塑到位

Gui*_*ari 6 numpy in-place memory-consumption reshape

有没有办法在numpy数组上进行重构,但是就地.我的问题是我的阵列非常大,所以任何不必要的副本都不会给内存带来压力.

我目前的做法是这样的:

train_x = train_x.reshape(n,32*32*3)
Run Code Online (Sandbox Code Playgroud)

这并没有完全解决问题,因为它创建了一个新数组,然后将标签train_x赋予新数组.

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

问题是我有这样的事情:

train_x, train_y = train_set
train_x = train_x.reshape(n,32*32*3)
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,即使train_x不再指向原始数组,仍然有一个指向原始数组的指针train_set.

我想要一种方法将前一个数组的所有指针更改为这个新数组.有办法吗?

或许还有其他一些方法来处理这个/

hpa*_*ulj 10

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

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]])
Run Code Online (Sandbox Code Playgroud)

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

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]])
Run Code Online (Sandbox Code Playgroud)

  • 哇,这很有启发性。所以我想 reshape 不是阻碍我记忆的操作。我看到 y += 1 已经到位,但如果我做了 y = y + 1 就不会了?我想我可能遇到了这个问题。 (2认同)
  • 右 `y = y+1` 创建一个包含新数据的新数组。 (2认同)
  • 它不能将 `int` 数组更改为就地浮点数。 (2认同)