是否有一种方法可以对numpy数组进行整形,但是可以就位。我的问题是我的数组很大,因此任何不必要的副本都不会占用内存。
我当前的方法是这样的:
train_x = train_x.reshape(n,32*32*3)
这不能完全解决问题,因为它会创建一个新数组,然后将标签train_x
分配给新数组。
在正常情况下,这是可以的,因为垃圾收集器很快就会收集原始数组。
问题是我有这样的东西:
train_x, train_y = train_set
train_x = train_x.reshape(n,32*32*3)
所以在这种情况下,即使train_x
不再指向原始数组,在train_set
内部仍然有一个指向原始数组的指针。
我想要一种将先前数组的所有指针更改为此新数组的方法。有办法吗?
或者也许还有其他处理此问题的方法/
对于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]])
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]])