无平铺的水平串联的有效方法
Efficient way of horizontal concatenation without tiling
我有两个(大)数组。出于说明目的,我在下面使用一个简单的示例:
In [14]: arr1 = np.arange(32*512).reshape(32, 512)
In [15]: arr2 = np.arange(512).reshape(1, 512)
我想对这些数组进行水平串联(即沿轴 1 的串联)。我想出了以下方法来实现这一点:
In [16]: np.hstack([arr1, np.tile(arr2, (arr1.shape[0], 1))]).shape
Out[16]: (32, 1024)
这按预期工作。但是,我想知道是否有任何其他有效的方法可以在不使用 numpy.tile
的情况下进行这种连接。恐怕我会炸毁我的内存需求,因为数组真的很大。
如果可以避免这种行重复(以匹配 arr1
的维度),或者使用广播,那就太好了!
P.S.之所以要避免这种复制是因为内存需求线性增长:
In [20]: arr2.nbytes
Out[20]: 4096
In [19]: np.tile(arr2, (arr1.shape[0], 1)).nbytes
Out[19]: 131072
In [22]: arr1.shape[0] * arr2.nbytes
Out[22]: 131072
您可以预分配和使用广播,但不会节省太多(我预计峰值内存使用量会下降大约四分之一):
arr1 = np.arange(32*512).reshape(32, 512)
arr2 = np.arange(512).reshape(1, 512)
out = np.empty((32, 1024), arr1.dtype)
out[:, :512] = arr1
out[:, 512:] = arr2
out
#array([[ 0, 1, 2, ..., 509, 510, 511],
# [ 512, 513, 514, ..., 509, 510, 511],
# [ 1024, 1025, 1026, ..., 509, 510, 511],
# ...,
# [14848, 14849, 14850, ..., 509, 510, 511],
# [15360, 15361, 15362, ..., 509, 510, 511],
# [15872, 15873, 15874, ..., 509, 510, 511]])
我有两个(大)数组。出于说明目的,我在下面使用一个简单的示例:
In [14]: arr1 = np.arange(32*512).reshape(32, 512)
In [15]: arr2 = np.arange(512).reshape(1, 512)
我想对这些数组进行水平串联(即沿轴 1 的串联)。我想出了以下方法来实现这一点:
In [16]: np.hstack([arr1, np.tile(arr2, (arr1.shape[0], 1))]).shape
Out[16]: (32, 1024)
这按预期工作。但是,我想知道是否有任何其他有效的方法可以在不使用 numpy.tile
的情况下进行这种连接。恐怕我会炸毁我的内存需求,因为数组真的很大。
如果可以避免这种行重复(以匹配 arr1
的维度),或者使用广播,那就太好了!
P.S.之所以要避免这种复制是因为内存需求线性增长:
In [20]: arr2.nbytes
Out[20]: 4096
In [19]: np.tile(arr2, (arr1.shape[0], 1)).nbytes
Out[19]: 131072
In [22]: arr1.shape[0] * arr2.nbytes
Out[22]: 131072
您可以预分配和使用广播,但不会节省太多(我预计峰值内存使用量会下降大约四分之一):
arr1 = np.arange(32*512).reshape(32, 512)
arr2 = np.arange(512).reshape(1, 512)
out = np.empty((32, 1024), arr1.dtype)
out[:, :512] = arr1
out[:, 512:] = arr2
out
#array([[ 0, 1, 2, ..., 509, 510, 511],
# [ 512, 513, 514, ..., 509, 510, 511],
# [ 1024, 1025, 1026, ..., 509, 510, 511],
# ...,
# [14848, 14849, 14850, ..., 509, 510, 511],
# [15360, 15361, 15362, ..., 509, 510, 511],
# [15872, 15873, 15874, ..., 509, 510, 511]])