连接大numpy数组

2024-10-06 13:50:08 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一些NumPy数组a和{},其中a.shape是{},而{}是{}。N是一些样本,根据我的问题/算法可能会有所不同,但是a和{}的样本数总是相同的。在

现在我需要另一个形状为(N, 7500)的数组c,它保存[0:5000]中{}的值,以及{}中{}的值。在

目前,我正在创建一个零填充的缓冲区数组,并将值切片到其中:

# ...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”)方法吗?或者,在空间/内存消耗或计算时间方面,是否存在更好的解决方案?在

ab是从其他地方加载并经过预处理的,因此不能选择以某种方式直接将数据插入缓冲区c,而不创建{}和{}。在


Tags: ofnumpy算法zeros切片数组缓冲区insert
3条回答

c = np.hstack([a,b])会做你想做的。另请参见np.concatenate


Timeit结果

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]))

所以连接可能要快一点,因为hstack只是concatenate周围的包装器(不必要的函数调用)

作为参考

^{pr2}$

似乎和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

hstack快得多:

a = np.ones((5, 2500)).astype(np.float32)
b = np.zeros((5, 5000)).astype(np.float32)
n = 5

%%timeit
c = np.zeros((n, 7500)).astype(np.float32)
c[:, :2500] = a
c[:, 2500:] = b
10000 loops, best of 3: 70 µs per loop

%timeit c = np.hstack((a, b))
10000 loops, best of 3: 27 µs per loop

如果使用小数组,hstack比其他解决方案慢一些。 在内存使用方面,这两种方法应该是相似的。在

对于这些大小,只使用hstack是合理的。在

相关问题 更多 >