3

私は3Dヒストグラムを持っているか、簡単にするために形状の3D numpy配列(X、Y、Z)を持っていると考えています

import numpy as np
array = np.random.random((100,100,100))

numpy または scipy を使用して、球条件を満たす配列の値のインデックスを取得する最良の方法は何ですか?

(index_x**2 + index_y**2 + index_z**2) <= radius**2

明らかに、後の条件では、配列の中心は (0, 0, 0) です。一般に、条件は次のようになります。

((index_x-center_x)**2 + (index_y-center_y)**2 +(index_z-center_z)**2) <= radius**2

この問題は、単純な python ループを使用して簡単に解決できますが、最適化する必要があります。

助けてくれて本当にありがとうございます

4

2 に答える 2

4

最初に でインデックスを効率的に取得しogrid()、次に で条件を満たすインデックスを取得できますnonzero()

インデックスを取得するには、次のようにゼロ以外の() を使用して取得できます。

indexes = numpy.transpose((x**2+y**2+z**2 <= radius**2).nonzero())  # transpose() might be unnecessary: it depends on your needs

インデックス配列はogrid () で効率的に取得されます:

x, y, z = numpy.ogrid[:100, :100, :100]

または、入力data配列の任意の形状の場合:

x, y, z = ogrid[tuple(slice(None, dim) for dim in data.shape)]
于 2012-11-16T10:01:45.330 に答える
1

@EOL のナイス アプローチをより一般的にするために、配列の形状内に中心を定義できます。

array = np.random.random((100,100,100))
center = (30,10,25)
radius = 5.0
x, y, z = np.ogrid[-center[0]:array.shape[0]-center[0],-center[1] :array.shape[1]-center[1], -center[2]:array.shape[2]-center[2]]
indexes = numpy.transpose((x**2+y**2+z**2 <= radius**2).nonzero())
于 2012-11-16T10:20:08.670 に答える