没有内存分配的numpy tile

Jak*_*x32 2 python memory numpy matrix tile

我正在考虑一种使用np.tile但不为新矩阵分配内存的方法。有没有办法实现这一目标?

有点冗长,我正在寻求的功能如下:

a = np.random.rand(4,)
b = np.random.rand(8,)
c = np.tile(a,2) + b # this generate a memory copy anyhow
Run Code Online (Sandbox Code Playgroud)

我想避免np.tile.

任何帮助表示赞赏。

hpa*_*ulj 6

c = (b.reshape(2,4)+a).ravel()
Run Code Online (Sandbox Code Playgroud)

reshape 和 ravel 都是视图,所以(我认为)唯一的新数组是由求和产生的。实际上,我正在更改b为可以使用a.

即使在这个小问题中,这也明显更快。


broadcast_array 让您分步进行广播

In [506]: b1,a1 = np.broadcast_arrays(b.reshape(2,4),a)  
Run Code Online (Sandbox Code Playgroud)

a1 是一个视图,如数据缓冲区指针所示

In [507]: a1.__array_interface__['data']
Out[507]: (164774704, False)
In [508]: a.__array_interface__['data']
Out[508]: (164774704, False)
Run Code Online (Sandbox Code Playgroud)

总和

In [509]: a1+b1
Out[509]: 
array([[ 2.04663934,  1.02951915,  1.30616273,  1.75154236],
       [ 1.79237632,  1.08252741,  1.17031265,  1.2675438 ]])
Run Code Online (Sandbox Code Playgroud)

a1 已有效地平铺而无需复制

In [511]: a1.shape
Out[511]: (2, 4)
In [512]: a1.strides
Out[512]: (0, 8)
Run Code Online (Sandbox Code Playgroud)

np.lib.stride_tricks.py有关此类广播的更多详细信息,请查看该文件。 np.lib.stride_tricks.as_strided是底层函数,可让您构建具有新形状和步幅的视图。它在 SO 上最常用于构建滑动窗口。