连接大的numpy数组

时间:2016-02-10 14:21:52

标签: python arrays numpy concatenation slice

假设我有一些NumPy数组http://localhost:2480/command/name your db/sql/explain your querya,其中ba.shape(N, 5000)b.shape(N, 2500)是一些样本,可能会因我的问题/算法而异 - 但Na的内容始终相同。

现在我想要另一个形状为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}}。

3 个答案:

答案 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比其他解决方案慢一点。 在内存使用方面,两种方法都应该类似。