python - 합치기 - 파이썬 행렬 만들기



numpy 배열 목록을 하나의 배열로 병합(빠름) (1)

80 개의 320x320 어레이가 있습니까? 그래서 dstack 을 사용하고 싶을 것이다.

first3 = numpy.dstack(firstmatrices)

이렇게하면 numpy.array(firstmatrices) 처럼 80x320x320 배열 하나가 반환됩니다.

timeit numpy.dstack(firstmatrices)
10 loops, best of 3: 47.1 ms per loop


timeit numpy.array(firstmatrices)
1 loops, best of 3: 750 ms per loop

vstack 을 사용하려면 25600x320 배열을 반환합니다.

timeit numpy.vstack(firstmatrices)
100 loops, best of 3: 18.2 ms per loop

https://code.i-harness.com

목록의 길이와 배열의 크기를 모두 알고있는 경우 numpy 배열 목록을 하나의 배열로 병합하는 가장 빠른 방법은 무엇입니까?

나는 두 가지 접근법을 시도했다 :

vstack 이 빠르다는 것을 볼 수는 있지만, 어떤 이유로 첫 번째 실행은 두 번째보다 3 배 더 오래 걸립니다. 나는 이것이 ( preallocation 없는) preallocation 에 의한 것이라고 생각한다. 그렇다면 vstack 위한 배열을 미리 할당하는 방법은 무엇입니까? 아니면 더 빠른 방법을 아십니까?

감사!

[최신 정보]

나는 (25280, 320) merged_array = array(list_of_arrays) 나를 위해 일하지 않을 것을 의미하는 (25280, 320) not (80, 320, 320)merged_array = array(list_of_arrays) . 그걸 지적 해 준 Joris에게 감사드립니다 !!!

산출:

0.547468900681 s merged_array = array(first_list_of_arrays)
0.547191858292 s merged_array = array(second_list_of_arrays)
0.656183958054 s vstack first
0.236850976944 s vstack second

암호:

import numpy
import time
width = 320
height = 320
n_matrices=80

secondmatrices = list()
for i in range(n_matrices):
    temp = numpy.random.rand(height, width).astype(numpy.float32)
    secondmatrices.append(numpy.round(temp*9))

firstmatrices = list()
for i in range(n_matrices):
    temp = numpy.random.rand(height, width).astype(numpy.float32)
    firstmatrices.append(numpy.round(temp*9))


t1 = time.time()
first1=numpy.array(firstmatrices)
print time.time() - t1, "s merged_array = array(first_list_of_arrays)"

t1 = time.time()
second1=numpy.array(secondmatrices)
print time.time() - t1, "s merged_array = array(second_list_of_arrays)"

t1 = time.time()
first2 = firstmatrices.pop()
for i in range(len(firstmatrices)):
    first2 = numpy.vstack((firstmatrices.pop(),first2))
print time.time() - t1, "s vstack first"

t1 = time.time()
second2 = secondmatrices.pop()
for i in range(len(secondmatrices)):
    second2 = numpy.vstack((secondmatrices.pop(),second2))

print time.time() - t1, "s vstack second"




numpy