假设我有一些 NumPy 数组 a
和 b
,其中 a.shape
是 (N, 5000)
并且 b.shape
是 (N, 2500)
。 N
是一些样本,可能会根据我的问题/算法而有所不同 - 但它对于 a
和 b
总是相同的。
现在我想要另一个形状为 (N, 7500)
的数组 c
,它在 [0: 5000]
和 b
在 [5000:7500]
中的值。
目前我正在创建一个零填充缓冲区数组并将值切片到其中:
# ...retrieving a
# ...retrieving b
c = zeros.((N, 7500)).astype(np.float32)
# insert values of a
c[:, 0:5000] = a
# insert values of b
c[:, 5000:7500] = b
# free up memory
del a, b
这是一种快速/高效(因此是“pythonic”/“numpy'ish”)的方式吗?或者是否存在在空间/内存消耗或计算时间方面更好的解决方案?
a
和 b
是从其他地方加载并经过预处理的,因此无法以某种方式直接将数据插入缓冲区 c
无需创建 a
和 b
。
最佳答案
c = np.hstack([a,b])
会做你想做的事。另见 np.concatenate
时间结果
a = np.ones((1000,5000), dtype=np.float64)
b = np.ones((1000,2500), dtype=np.float64)
%timeit c = np.concatenate([a,b], axis=1)
1000 loops, best of 3: 66.4 ms per loop
%timeit c = np.hstack([a,b])
1000 loops, best of 3: 67.3 ms per loop
# Check that it is really the same:
np.testing.assert_array_equal(np.concatenate([a,b], axis=1), np.hstack([a,b]))
所以 concatenate 可能会快一点,因为 hstack
只是 concatenate
的包装器(不必要的函数调用)
作为引用
%%timeit
c = np.zeros((1000, 7500), dtype=np.float64)
# insert values of a
c[:, 0:5000] = a
# insert values of b
c[:, 5000:7500] = b
1000 loops, best of 3: 69.7 ms per loop
看起来几乎和 concatenate
一样快。但这只是因为第一个轴是 1000
。如果我将第一个轴更改为仅包含 10
元素,则时间完全不同:
a = np.ones((10,5000), dtype=np.float64)
b = np.ones((10,2500), dtype=np.float64)
# concatenate
1000 loops, best of 3: 349 µs per loop
# hstack
1000 loops, best of 3: 406 µs per loop
# your approach
1000 loops, best of 3: 452 µs per loop
关于python - 连接大的 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35317706/