Python Numpy.ndarray.shape limit - PullRequest
       8

Python Numpy.ndarray.shape limit

4 голосов
/ 16 мая 2011

Я хочу создать матрицу с Numpy в Python со следующим кодом:

import numpy

result=numpy.zeros((20,20,20,30,30,30))

numpy.save('result',result)

Я получаю следующую ошибку:

Traceback (most recent call last):  
File "numpy_memoryerror.py",
line 5, in <module>
    result=numpy.zeros((20,20,20,30,30,30))
MemoryError

Если я использую меньшие размеры, подобные этим:

result=numpy.ones((10,10,10,20,20,20))

тогда код работает.

Может кто-нибудь сказать мне предел кортежа формы?

1 Ответ

6 голосов
/ 16 мая 2011

Это не фундаментальный предел кортежа формы, это то, что у вас недостаточно памяти (RAM) в вашей системе, следовательно, MemoryError.

Снова 20 * 20 * 20 * 30 *30 * 30 - это 216 миллионов 64-разрядных (8 байт) операций с плавающей запятой или чуть более 1,6 ГБ ОЗУ.Итак, у вас есть 1,6 ГБ ОЗУ свободно при запуске сценария в этот момент?(Не забудьте обо всей оперативной памяти, используемой python, ОС, другими запущенными программами и т. Д.).Если вы находитесь в Linux / Unix, вы можете увидеть, сколько свободной памяти, набрав free -m в командной строке.В окнах вы можете увидеть свободную память, перейдя в диспетчер задач.Кроме того, некоторые ОС ограничивают объем памяти, который может выделить один процесс (например, python);например, 32-битные окна дают только 2 ГБ адресного пространства на процесс).

Сравните это с 20 * 20 * 20 * 10 * 10 * 10, что составляет всего ~ 0,06 ГБ (или всего в 27 раз меньше).объем памяти).

Если вам не нужны 8-байтовые числа с плавающей запятой, вы можете сделать

numpy.zeros(20,20,20,30,30,30, dtype='float32')

, который уменьшит объем памяти, используя 32-разрядные числа с плавающей запятой одинарной точности.По умолчанию numpy использует dtype = 'float64'.

Грубо говоря, 32-разрядное число с плавающей запятой имеет 8 цифр точности, а 64-разрядное число с плавающей запятой имеет 16 цифр точности.Это означает, что 1 + 1e-8 отображается как 1 для 32-разрядных операций с плавающей запятой, а 1 + 1e-16 - 1 для 64-разрядных операций с плавающей запятой, но 1 + 1e-15 отображается как 1.000000000000001 с 64-разрядными операциями с плавающей запятой, но не 32бита.

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