【发布时间】:2023-03-29 02:15:01
【问题描述】:
对于arr 中的任何一个axis,我想将一个numpy 数组arr 重塑为(before, at, after) 的形状。如何更快地做到这一点?
轴已归一化:0 <= axis < arr.ndim
程序:
import numpy as np
def f(arr, axis):
shape = arr.shape
before = int(np.product(shape[:axis]))
at = shape[axis]
return arr.reshape(before, at, -1)
测试:
a = np.arange(2 * 3 * 4 * 5).reshape(2, 3, 4, 5)
print(f(a, 2).shape)
结果:
(6, 4, 5)
【问题讨论】:
-
% timeit (f(a, 2).shape) 8.14 µs ± 489 ns 每个循环(平均值±标准差,7 次运行,每次 100000 次循环)你真的对速度感兴趣吗? ;)
-
现在是星期五晚上,我想我很无聊或强迫症哈哈。像
arr += np.arange(arr.size, dtype=arr.dtype)这样的东西在同样的意义上有点疯狂,但很多人都这样做。这只是 c++ 中的一个简单循环 ... -
每次循环使用低于 5.08 µs ± 234 ns 的 reduceat(平均 ± 标准偏差,7 次运行,每次 100000 次循环),因此您将有更多时间在手 ;)