3

Python 3.3 を使用してコードを実行しています。目標は、data_3d (1000x1000x1000 Boolean ndarray) を kernel (35x35x35 float ndarray) に関連付けることです。

次に、別の相関を実行して、前の結果を合計します。そのため、別の 1000x1000x1000 Boolean ndarray を 35x35x35 float ndarray と関連付けています。これは前の手順とまったく同じです。

ここで私は混乱します。最初の相関は 70 秒で完了します。2番目の(一見同一の)プロセスは完了しません(つまり、1時間以上待機しました...)。

2 番目の相関 (たとえば、5x5x5 配列との相関) のサイズを縮小しようとしましたが、同じ結果が得られました。

おそらく、これはメモリの問題ではありません。2 番目のプロセスでは、メモリが 18 GB でプラトーになります (ただし、まだ 14 GB を使用できます...)。

どうしたの?

これが私のコードです:

import numpy as np
from scipy import ndimage as im

パート A:

t1 = time.time()
# Used to time the process`
# a is a np.ndarray of dtype = bool
a = im.correlate(data_3d, kernel) > threshold 
t2 = time.time()
print(t2 - t1) # About 70 seconds

パート B: この次のパートは決して完成しません!

b = im.correlate(a, np.ones((35, 35, 35)))
t3 = time()`

編集:解決策を見つけました。パート A のカーネルは非常にまばらですが、パート B のカーネルは完全に読み込まれています。Scipy には、スパース行列のフィルター サイズを変更するための裏技が必要です。これにより、A = O(N^3) および B = O(N^3 * n^3) の時間が複雑になります。 N = 画像の 1D サイズおよび n = カーネルの 1D サイズ。

4

1 に答える 1