0

非常に大きなセットのベクトルのすべての可能な内積順列の 2^nx 2^n numpy 配列を作成しようとしています。私のテスト配列「データ」は、(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> 行列 = 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 行目、reshape return reshape(newshape, order=order)

ValueError: 最大許容寸法を超えました

4

2 に答える 2

3

なぜあなたはnum,num形を変えるために渡されているのに、あなたが形を変えている実際のものではないのですか?

おそらく、return np.reshape(S, (num, num))代わりに次のようなものが必要ですか?


実際のエラーに関しては、2^129 は非常に大きな数です。通常の 64 ビット整数でさえ、2^64 までしかインデックスできません。マシンのメモリには、おそらく 2^129 x 2^129 の行列を含めることはできません。

本当にそんなに処理したいですか?GHz プロセッサを使用しても、単一の CPU サイクルで要素を操作できる場合 (おそらくできない場合)、処理に約 2^100 秒かかります。

于 2012-11-01T03:16:55.200 に答える
2

デカルト積はO(2 ^ n)ではなくO(n ^ 2)です(幸運です)。おそらくそれが「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))
于 2012-11-01T05:24:47.860 に答える