Python: как обычно обойти ошибку превышения максимально допустимого размера?

Я пытаюсь создать массив размером 2 ^ n x 2 ^ n numpy всех возможных перестановок скалярного произведения очень большого набора векторов. Мой тестовый массив «data» представляет собой массив (129L, 222L) numpy. Моя функция кажется (по моему мнению новичка) довольно простой. Просто у меня слишком много данных для обработки. Как программисты обычно решают эту проблему? Какие-либо предложения?

Мои данные:

>>> data
array([[  1.36339199e-07,   6.71355407e-09,   2.13336419e-07, ...,
          8.44471296e-10,   6.02566662e-10,   3.38577178e-10],
       [  7.19224620e-08,   5.64739121e-08,   1.49689547e-07, ...,
          3.85361972e-10,   3.17756751e-10,   1.68563023e-10],
       [  1.93443482e-10,   1.11626853e-08,   2.66691759e-09, ...,
          2.20938084e-11,   2.56114420e-11,   1.31865060e-11],
       ..., 
       [  7.12584509e-13,   7.70844451e-13,   1.09718565e-12, ...,
          2.08390730e-13,   3.05264153e-13,   1.62286818e-13],
       [  2.57153616e-13,   6.08747557e-13,   2.00768488e-12, ...,
          6.29901984e-13,   1.19631816e-14,   1.05109078e-13],
       [  1.74618064e-13,   5.03695393e-13,   1.29632351e-14, ...,
          7.60145676e-13,   3.19648911e-14,   8.72102078e-15]])`

Моя функция:

import numpy as np
from itertools import product, count

def myFunction(data):
    S = np.array([])
    num = 2**len(data)
    y = product(data, repeat = 2)
    for x in count():
        while x <= num:
            z = y.next()
            i, j = z
            s = np.dot(i, j)
            S = np.insert(S, x, s)
            break #for the 'StopIteration' issue
        return np.reshape(S, (num,num))

Моя ошибка:

>>> theMatrix = myFunction(data)

Отслеживание (последний вызов последний):

Файл "C: \ Python27 \ lib \ site-packages \ IPython \ core \ interactiveshell.py", строка 2721, в run_code exec code_obj в self.user_global_ns, self.user_ns

Файл "", строка 1, в <module> matrix = myFunction (data)

Файл "E: \ Folder1 \ Folder2 \ src \ myFunction.py", строка 16, в myFunction return np.reshape (S, (num, num))

Файл "C: \ Python27 \ lib \ site-packages \ numpy \ core \ fromnumeric.py", строка 171, в изменении формы return reshape (newshape, order = order)

ValueError: превышен максимально допустимый размер


person Noob Saibot    schedule 01.11.2012    source источник


Ответы (2)


декартово произведение - это O (n ^ 2), а не O (2 ^ n), (удачно для ты). Возможно, это также причина вашей проблемы "StopIteration"

S = np.array([])
num = len(data) ** 2  # This is not the same as 2 ** len(data) !!
y = product(data, repeat=2)
for x in count():
    while x <= num:
        z = y.next()
        i, j = z
        s = np.dot(i, j)
        S = np.insert(S, x, s)
        break #for the 'StopIteration' issue
    return np.reshape(S, (num, num))
person John La Rooy    schedule 01.11.2012

Почему вы передаете num,num, чтобы изменить форму, а не то, что вы переделываете?

Возможно, вам вместо этого нужно что-то вроде return np.reshape(S, (num, num))?


Что касается фактической ошибки, 2 ^ 129 - чертовски большое число - даже ваше обычное 64-битное целое число может индексировать только до 2 ^ 64. Память вашего компьютера, вероятно, не может содержать матрицу 2 ^ 129 x 2 ^ 129.

Вы уверены, что действительно хотите так много обрабатывать? Даже с процессором с тактовой частотой ГГц это по-прежнему составляет ~ 2 ^ 100 секунд обработки, если вы можете работать с элементом за один цикл процессора (что вы, вероятно, не можете).

person Amber    schedule 01.11.2012
comment
Ой ... хороший улов. Я поправил ... Никаких кубиков. (См. Отредактированный пост) - person Noob Saibot; 01.11.2012
comment
2 ^ 129 - чертовски большое число - даже ваше обычное 64-битное целое число может индексировать только до 2 ^ 64. Вы уверены, что действительно хотите так много обрабатывать? Даже с процессором с тактовой частотой ГГц это все равно ~ 2 ^ 100 секунд обработки, если вы можете работать с элементом за один цикл процессора (что вы, вероятно, не можете). - person Amber; 01.11.2012