假设我有一些NumPy数组http://localhost:2480/command/name your db/sql/explain your query
和a
,其中b
为a.shape
且(N, 5000)
为b.shape
。 (N, 2500)
是一些样本,可能会因我的问题/算法而异 - 但N
和a
的内容始终相同。
现在我想要另一个形状为b
的{{1}}数组c
,其中包含(N, 7500)
和a
&#39}中的[0:5000]
个值b
中的值。
目前我正在创建一个零填充缓冲区数组并将值切入其中:
[5000:7500]
这是一种快速/高效,(因此" pythonic" /" numpy' ish")这样做的方法?或者在空间/内存消耗或计算时间方面存在更好的解决方案?
# ...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
和a
从其他地方加载并进行预处理,因此无法以某种方式将数据直接插入缓冲区b
而无需创建c
和{ {1}}。
答案 0 :(得分:3)
对于这些尺寸,仅使用hstack是合理的。
答案 1 :(得分: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]))
所以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
答案 2 :(得分:3)
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
比其他解决方案慢一点。
在内存使用方面,两种方法都应该类似。