Ускорить конкатенацию массива numpy

У меня есть следующий код. Я конвертирую cp_X_train из RGB в оттенки серого и объединяю его с X_train_gray.

X_train_gray = np.empty([0, 32, 32, 1])

start = timer()
for i in range(cp_X_train.shape[0]):
    if i % 1000 == 0:
        print(i)
        end = timer()
        print(end - start)
        start = timer()
    gray_img = cv2.cvtColor(cp_X_train[i], cv2.COLOR_BGR2GRAY)[None, :, :, None]
    X_train_gray = np.concatenate((X_train_gray, gray_img), axis=0)

Я распечатываю время обработки каждые 1000 образцов.

0
0.00042258699977537617
1000
3.331055953000032
2000
9.222047281000414
3000
15.596254615000362
4000
21.37355997799932
5000
27.513121935999152
6000
33.477182841001195
7000
40.4089376539996
8000
47.39131554400046
9000
53.73745651799982

Как видите, на старте время обработки небольшое. Но по мере того, как X_train_gray становится больше, время обработки увеличивается. Как мне исправить эту ситуацию?


person Lion Lai    schedule 31.07.2017    source источник
comment
Не могли бы вы объединить в список свои grey_img, а затем вызвать np.concatenate в конце? В настоящее время вы итеративно увеличиваете массив, который неэффективен.   -  person EdChum    schedule 31.07.2017
comment
Вы также можете создать X_train_gray как массив нулей, а затем перезаписать их X_train_gray[i] = .... Если вам нужно знать количество изображений заранее.   -  person blckbird    schedule 31.07.2017
comment
numpy.concatenate должен выделить память для нового массива, а затем каждый раз копировать данные из двух заданных массивов. Итак, вы постоянно перестраиваете растущий массив, что занимает много памяти и времени.   -  person ForceBru    schedule 31.07.2017
comment
@EdChum: я знаю, что итеративно выращиваю X_train_gray. Но я не знаю, как это исправить. Я должен хранить каждый файл gray_img.   -  person Lion Lai    schedule 31.07.2017
comment
объявите пустой список вне вашего цикла, добавьте к нему свои серые изображения в цикле. После вызова цикла np.concatenate один раз передайте список grey_imgs   -  person EdChum    schedule 31.07.2017
comment
Я понял, спасибо.   -  person Lion Lai    schedule 31.07.2017