我正在尝试制作一个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:超出允许的最大尺寸
答案 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))