2013-12-12 4 views
2

У меня есть каталог с несколькими .npy-файлами (массивы numpy), каждый файл имеет 2-мерный массив (та же ширина и высота). Мне нужно прочитать все файлы и создать трехмерный массив, содержащий все массивы в каталоге, форма результата должна быть чем-то вроде (количество файлов, ширина, высота).Импортировать файлы массивов с numpy

Мой код до сих пор:

import os 
import numpy 

for file in os.listdir(os.getcwd()): 
    result = numpy.load(file) #Obviously this doen't work 

Но я просто не знаю, как создать массив результатов. Должен ли я сначала создать массив нулей, а затем заполнить его? Могу ли я сделать это на лету? Вы можете мне помочь?

+2

[ 'np.dstack (массивы)'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.dstack.html#numpy.dstack) – user2357112

+2

С numpy, обычно рекомендуется определить массив нулей и заполнить его контентом. – leeladam

+0

Подождите, dstack заказывает оси иначе, чем я думал. Возможно, вам придется переупорядочить их с помощью нарезки или использовать что-то еще. – user2357112

ответ

2

Если вы знаете, сколько их есть и что такое размер, сначала создайте пустой массив. (Пустой массив быстрее, потому что вы не должны обнулить все элементы.) Что-то вроде этого:

# Allocate empty array. 
bigarray = numpy.empty([width, height, len(filenames)]); 
# Load files. 
for i in range(len(filenames)): 
    bigarray[:,:,i] = numpy.load(filenames[i]); 

Если вы не знаете размеры заранее, используйте numpy.append. Это довольно медленно, потому что для каждой итерации ему необходимо выделить новый фрагмент памяти и скопировать данные. Попробуйте это:

# Load first array. 
bigarray = numpy.load(filenames[0]); 
# Add a new axis to make it 3D. 
bigarray = bigarray[numpy.newaxis,...]; 
# Load rest of arrays. 
for i in range(1,len(filenames)): 
    bigarray = numpy.append(bigarray, numpy.load(filenames[i])[numpy.newaxis,...], axis=0); 
+0

Очень хороший ответ, спасибо. –

Смежные вопросы