Преобразование очень большого списка 3D Python в массив numpy никогда не заканчивается - PullRequest
0 голосов
/ 07 августа 2020

У меня есть очень большой список 3D Python (1486x4656x34) чисел с плавающей запятой, который мне нужен для вычисления среднего значения по оси 0 (чтобы получить результат 4656x34). Я попытался сделать это с помощью np.mean(arr, axis=0), но метод, похоже, никогда не завершает свое выполнение (или, если это так, требуется больше времени, чем у меня есть, чтобы дождаться его).

Возникает аналогичная проблема при запуске других методов numpy в массиве, включая np.array(), что заставляет меня думать, что проблема связана с преобразованием этого списка в массив numpy. Я действительно не понимаю, почему это происходит; Этот массив большой, но не кажется слишком большим, и я не ограничиваю использование ЦП или нехватку памяти. Кто-нибудь знает, почему может возникать эта проблема, и что я могу сделать, чтобы ее обойти?

1 Ответ

2 голосов
/ 07 августа 2020

Возможно, у вас на самом деле не совсем правильная форма. Я не могу воспроизвести проблему, если вы это сделаете, но могу легко воспроизвести ее, если форма неправильная (что приводит к массиву объектов, а не массиву чисел). Время, показанное ниже, относится к достаточно старому компьютеру.

import numpy as np
import time

n0 = 1846
n1 = 4656
n2 = 34

t0 = time.time()

biglist = [[[1. for k in range(n2)] for j in range(n1)] for i in range(n0)]

t1 = time.time()
print(t1 - t0)  # order of 20 seconds to construct the nested list

bigarr = np.array(biglist)

t2 = time.time()
print(t2 - t1)  # order of 10 seconds to convert to np.array

mean = np.mean(bigarr, axis=0)

t3 = time.time()
print(t3 - t2)  # about 0.3 seconds

biglist[456][3265].pop()  # now disrupt the regular shape

t3a = time.time()
bigarr = np.array(biglist)

t4 = time.time()
print(t4 - t3a)  # now really quick (about 1s) to convert to array, but all 
                 # it is doing is making an (2d) array of object references
                 # because the shapes don't match (dtype = object)

mean = np.mean(bigarr, axis=0)  # this takes forever...
                                # (not even sure what the result
                                # should look like)

Для проверки:

  • явно преобразовать в массив
  • протестировать dtype массива перед пытается позвонить np.mean
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...