7

Scipy放射基底関数(Rbf)を使用して、2Dサーフェスを表すそれほど大きくない(〜10.000サンプル)点群を内挿しようとしています。いくつかの良い結果が得られましたが、実行中にエラーがほぼ瞬時に表示されたとしても、最後のデータセットでは一貫して取得MemoryErrorしています(RAMは明らかに使い果たされていません)。

rbf.py私はScipyからファイルのコピーをハックすることにしました。まず、いくつかの印刷ステートメントでファイルを埋めることから始めました。これは非常に便利です。_euclidean_norm次のように、メソッドを1行ずつ分解します。

def _euclidean_norm(self, x1, x2):
    d = x1 - x2
    s = d**2
    su = s.sum(axis=0)
    sq = sqrt(su)
    return sq

最初の行にエラーが表示されます。

File "C:\MyRBF.py", line 68, in _euclidean_norm
    d = x1 - x2
MemoryError

そのノルムは、[[x1、y1]、[x2、y2]、[x3、y3]、...、[xn、yn]]の形式の配列X1と、X1によって置き換えられたX2に対して呼び出されます。クラス内の次のメソッドRbf。デバッグ目的ですでにハッキングされています。

def _call_norm(self, x1, x2):
    print x1.shape
    print x2.shape
    print

    if len(x1.shape) == 1:
        x1 = x1[newaxis, :]
    if len(x2.shape) == 1:
        x2 = x2[newaxis, :]
    x1 = x1[..., :, newaxis]
    x2 = x2[..., newaxis, :]

    print x1.shape
    print x2.shape
    print

    return self._euclidean_norm(x1, x2)

入力の形状を印刷していることに注意してください。私の現在のデータセットでは、それが私が得たものです(私は手動でコメントを追加しました):

(2, 10744)         ## Input array of 10744 x,y pairs
(2, 10744)         ## The same array, which is to be "reshaped/transposed"

(2, 10744, 1)      ## The first "reshaped/transposed" form of the array
(2, 1, 10744)      ## The second "reshaped/transposed" form of the array

理論的根拠は、ドキュメントによると、「x1の各ポイントからx2の各ポイントまでの距離の行列」を取得することです。つまり、配列は同じであるため、エントリ配列のすべてのペア間の距離の行列( XおよびY次元が含まれています)。

はるかに小さい配列(たとえば、形状(2,5,1)と(2,1,5))を使用して手動で操作をテストし、減算が機能しました。

データセットで機能しない理由をどのように確認できますか?他に明らかなエラーはありますか?データセットの何らかの形の悪条件をチェックする必要がありますか、それとも前処理を実行する必要がありますか?3Dでプロットでき、クラウドポイントが視覚的に非常によく形成されているので、条件が整っていると思います。

どんな助けでも大歓迎です。

読んでくれてありがとう。

4

1 に答える 1

8

データセットは問題ないはずです。減算の結果を保存するのに十分なRAMがないため、エラーが表示されます。

放送ルールによると、結果は形になります

 (2, 10744,     1)
-(2,     1, 10744)
------------------
 (2, 10744, 10744)

これらがdtypefloat64の配列であると仮定すると、2 * 10744 ** 2 * 8 =1.72GiBの空きメモリが必要です。十分な空きメモリがない場合、numpyは出力配列を割り当てることができず、表示されるエラーですぐに失敗します。

于 2012-08-08T19:00:50.697 に答える