2012-10-02 40 views
3

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

E.g. 阵列100x100x100,我想第一切片是平行四边形开始

x=0,y=0 => x=100,y=100z方向0-25含有点x=0时,和由时间x=100线性变化到z=25-50。所以是一种对角切片。

有没有一种有效的方式来做到这一点在numpy。理想情况下类似

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

你能举一个例子(我不太明白),就像你所期望的这个看像一个3x3? –

+0

如果您将数据视为立方体,那么一个简单的切片就是从顶部取平面截面。确定 - 在2 - d它将是 [[6,5,4], [1,2,3], [5,7,9]] 1深度切片将[6,5,4 ]。不过,我想要一个半对角切片,可能是[6,5,3](第3行来自第2行)。 紧接着[1,2,9]。现在将其缩放到100x100,并从第一行开始进行斜切,以将后续的25行包括在LHS中,但在阵列的RHS上取第25-50行并在其间进行插值。 – Julian

回答

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] 

使用numpy的阵列xiyi切片oldarrayzi触发高级索引。 numpy的将通过广播xiyizi(因此在此情况下产生具有所述相同的形状形成的新的数组,因为xi是(100,1,1),yi为(1,100,1),和zi是(100,100,25),输出将是(100,100,25))。

numpy的填充,然后使用xiyizi(含广播)对应的元素数组,所以newarray[i, j, k] = oldarray[xi[i, 0, 0], yi[0, j, 0], zi[i, j, k]]

+0

我已经阅读了几次,并且从概念上看不到它是如何工作的! – Julian

+0

是的,*高级索引*可能有点头破血。它与标准索引完全不同。我会添加一个解释... – nneonneo

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

注意有可能是一个更好的办法做到这一点没有所有的整形。

相关问题