Python:如何通常解决“超出允许的最大维度”错误?

时间:2012-11-01 03:13:12

标签: python numpy multidimensional-array large-data

我正在尝试制作一个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 in self.user_global_ns,self.user_ns

         

文件“”,第1行,<module>         matrix = myFunction(data)

         

myFunction中的文件“E:\ Folder1 \ Folder2 \ src \ myFunction.py”,第16行         return np.reshape(S,(num,num))

         

文件“C:\ Python27 \ lib \ site-packages \ numpy \ core \ fromnumeric.py”,第171行,重塑         return reshape(newshape,order = order)

  
     

ValueError:超出允许的最大尺寸

2 个答案:

答案 0 :(得分:3)

你为什么要通过num,num重塑,但不是你正在重塑的实际情况?

也许您想要return np.reshape(S, (num, num))之类的东西?


至于实际错误,2 ^ 129是一个相当大的数字 - 即使你的常规64位整数也只能索引2 ^ 64。机器的内存可能不包含2 ^ 129 x 2 ^ 129矩阵。

你确定你真的想要处理这么多吗?即使使用GHz处理器,如果你可以在单个cpu周期中操作一个元素(你可能不能),那么处理仍然需要大约2 ^ 100秒。

答案 1 :(得分:2)

cartesian product是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))