python - 连接大的 numpy 数组

标签 python arrays numpy concatenation slice

假设我有一些 NumPy 数组 ab,其中 a.shape(N, 5000) 并且 b.shape(N, 2500)N 是一些样本,可能会根据我的问题/算法而有所不同 - 但它对于 ab 总是相同的。

现在我想要另一个形状为 (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”)的方式吗?或者是否存在在空间/内存消耗或计算时间方面更好的解决方案

ab 是从其他地方加载并经过预处理的,因此无法以某种方式直接将数据插入缓冲区 c无需创建 ab

最佳答案

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/

相关文章:

python - docker exec 上的 Heredoc

objective-c - 如何使用数组使按钮按特定顺序播放声音?

java - 使二维数组不等式检查更快

java - 数组的值发生变化而没有任何命令影响它

Python:绘制从x轴上的点(X1,0)到点(X2,Y2)的线的问题

python - 如何居中对齐 numpy.savetxt 生成的文本?

python - 切片索引在 numpy 数组中如何工作

python - 从 Python 中的另一个类中调用方法

python - 使用 PyYAML 创建 pandas DataFrame 对象 - 超出递归深度

python - Django: 'User' 对象没有属性 'user'