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()

可以使用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 回答