我想在Python中创建一个3D数组,填充-1。
我测试了这些方法:
import numpy as np
l = 200
b = 100
h = 30
%timeit grid = [[[-1 for x in range(l)] for y in range(b)] for z in range(h)]
1 loops, best of 3: 458 ms per loop
%timeit grid = -1 * np.ones((l, b, h), dtype=np.int)
10 loops, best of 3: 35.5 ms per loop
%timeit grid = np.zeros((l, b, h), dtype=np.int) - 1
10 loops, best of 3: 31.7 ms per loop
%timeit grid = -1.0 * np.ones((l, b, h), dtype=np.float32)
10 loops, best of 3: 42.1 ms per loop
%%timeit
grid = np.empty((l,b,h))
grid.fill(-1.0)
100 loops, best of 3: 13.7 ms per loop
很明显,最后一个是最快的。有没有人有更快的方法或至少更少的内存密集?因为它在RaspberryPi上运行。
答案 0 :(得分:1)
我唯一可以想到的是,选择dtype
参数时,这些方法中的任何一个都会更快,占用尽可能少的内存。
假设您不再需要int8
的空间,@ RutgerKassies在评论中建议的方法在我的系统上花了这么长时间:
%timeit grid = np.full((l, b, h), -1, dtype=int8)
1000 loops, best of 3: 286 µs per loop
为了进行比较,使用相同的方法,未指定dtype
(默认为int32
)需要大约10倍的时间:
%timeit grid = np.full((l, b, h), -1)
100 loops, best of 3: 3.61 ms per loop
你最快的方法与np.full
(有时击败它)一样快:
%%timeit
grid = np.empty((l,b,h))
grid.fill(-1)
100 loops, best of 3: 3.51 ms per loop
或将dtype
指定为int8
,
1000 loops, best of 3: 255 µs per loop
编辑:这可能是作弊,但是,好吧......
%timeit grid = np.lib.stride_tricks.as_strided(np.array(-1, dtype=int8), (l, b, h), (0, 0, 0))
100000 loops, best of 3: 12.4 us per loop
这里发生的一切都是我们从一个长度为1的数组np.array([-1])
开始,然后调整步长,以便grid
看起来像一样完全像一个数组具有所需的尺寸。
如果您需要实际数组,可以使用grid = grid.copy()
;这使得grid
数组的创建速度与本页其他地方建议的最快方法一样快。
答案 1 :(得分:0)
这对我来说快一点。可能在RPi上有所不同。
grid = np.empty((l,b,h))
grid[...] = -1
如果它足够大, np.int8
要快得多
grid = np.empty((l,b,h), dtype=np.int8)
grid[...] = -1
%%timeit
grid = np.empty((l,b,h), dtype=np.int8)
grid[:] = -1
100 loops, best of 3: 6.91 ms per loop