2014-09-23 2 views
1

-1로 채워진 파이썬으로 3D 배열을 만들고 싶습니다. 파이썬에서 배열을 만드는 가장 빠른 방법

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

그런 배열을 만드는 가장 일반적인 방법은'grid = np.full ((l, b, h), -1)'입니다. 아니 그래도 빨리. –

+0

아, 제 질문은 [this] (http://stackoverflow.com/questions/5891410/numpy-array-initialization-fill-with-identical-values)의 dup입니다. – Balzer82

답변

1

가능한 한 적은 메모리. 비교를 위해

%timeit grid = np.full((l, b, h), -1, dtype=int8) 
1000 loops, best of 3: 286 µs per loop 

(int32을 디폴트) dtype를 지정하지 않는 약 10 나섭니다 :

은 가정 당신은 코멘트에 @RutgerKassies에서 제안하는 방법은 내 시스템에 이렇게 오래 걸렸다 더 이상 공간이 int8 필요하지

%timeit grid = np.full((l, b, h), -1) 
100 loops, best of 3: 3.61 ms per loop 

당신의 가장 빠른 방법은 빠른 속도로 (때로는 치기) np.full로에 대한했다 : 같은 방법으로 긴 시간

int8로 지정 dtype
%%timeit 
grid = np.empty((l,b,h)) 
grid.fill(-1) 
100 loops, best of 3: 3.51 ms per loop 

또는,

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 

모든 것을 여기에 무슨 일이 일어나고있다 우리가 길이가 하나 인 배열 np.array([-1])으로 시작한 다음 스트라이드 길이로 바이올린을 입력하십시오. grid을 필요한 치수의 배열과 똑같이 보입니다.

실제 배열이 필요한 경우 grid = grid.copy()을 사용할 수 있습니다. 이것은 grid 어레이의 생성을이 페이지의 다른 곳에서 제안 된 가장 빠른 접근법만큼 빨리 수행합니다.

+0

'np.full'에 대한 코드를 보면,'empty'를 만들고,'copyto'를 사용하여 그 값을 배열에 브로드 캐스트합니다. 'x [:] = ...'는 아마도 같은 기본 C 코드를 사용합니다. – hpaulj

0

이것은 나를 위해 조금 더 빠릅니다. RPi에서 다를 수 있습니다.

grid = np.empty((l,b,h)) 
grid[...] = -1 

np.int8

훨씬 빠르다는 충분히 큰의 경우 I 추가 생각할 수있는 유일한 것은 이러한 방법 중 하나는 빠른으로 채택하는 선택한 dtype 인수 될 것입니다

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 
+0

격자 % = timeit 격자 = np.empty ((l, b, h), dtype = np.int8) 격자 [:] = -1 100 루프, 3 : 6.91ms 당 루프'' ' – Balzer82

관련 문제