3

我有一个 3d 位置数据数组,我想从中获取2-d切片。然而,切片的z深度随x(并y最终)变化。

例如一个数组100x100x100,我希望第一个切片是从开始的平行四边形

x=0,y=0 => x=100,y=100包含时z方向上的点,并随时间线性变化。所以一种对角线切片。0-25x=0z=25-50x=100

有没有一种有效的方法可以在 numpy. 理想情况下像

    newarray = oldarray[z> x/100*25.0 && z < 25+x/100*25.0]
4

2 回答 2

1

您可以使用map_coordinates. 下面是一个 3x3x3 体积的小例子:

a = np.arange(27).reshape(3,3,3)
xi,yi = np.meshgrid(range(3),range(3))
zi = xi*.25+yi*.25
inds = np.array([xi.reshape(1,9),yi.reshape(1,9),zi.reshape(1,9)])
ndimage.map_coordinates(a,inds).reshape(3,3)
>> array([[ 0,  9, 18],
       [ 3, 12, 22],
       [ 6, 16, 25]])

请注意,在不进行所有重塑的情况下,可能有更好的方法来做到这一点。

于 2012-10-02T16:36:46.183 回答
1

因为您想要的数据可能无法表示为原始的跨步视图,所以您必须使用高级索引来提取您想要的坐标。

c = np.r_[:100]
xi = c.reshape((100, 1, 1))
yi = c.reshape((1, 100, 1))
zi = np.empty((100, 100, 25), dtype=int)
for x in xrange(100):
    for y in xrange(100):
        zi[x,y] = np.arange(x*25/100, x*25/100+25) # or whatever other function

newarray = oldarray[xi, yi, zi]

oldarray使用 numpy 数组xi, yi,切片zi会触发高级索引。Numpy 将创建一个新的数组,其形状与通过广播xi, yi, zi(所以在这种情况下,因为xiis (100, 1, 1), yiis (1, 100, 1), ziis (100, 100, 25 ) ),输出将是 (100, 100, 25))。

xi然后, Numpy 使用yi和的相应元素(通过广播)填充该数组zi,这样newarray[i, j, k] = oldarray[xi[i, 0, 0], yi[0, j, 0], zi[i, j, k]]

于 2012-10-02T17:02:16.830 回答