Numpy为变量z切片x,y,z数组

时间:2012-10-02 13:55:17

标签: python arrays numpy

我有一个3d数组的位置数据,我想从中获取2-d个切片。但是,切片在z深度与x(最终和y)之间会有所不同。

E.g。 一个数组100x100x100,我希望第一个切片是从

开始的平行四边形

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

是否有一种有效的方法可以在numpy中执行此操作。理想情况下像

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

2 个答案:

答案 0 :(得分: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]])

请注意,如果没有全部重塑,可能有更好的方法。

答案 1 :(得分: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数组oldarrayxiyi切片zi会触发高级索引。 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]]