Python Numpy切片变量z的x、y、z数组

Python Numpy切片变量z的x、y、z数组,python,arrays,numpy,Python,Arrays,Numpy,我有一个位置数据的3d数组,我想从中获取2-d切片。然而,切片在z深度上随x(以及y最终)而变化 例如。 一个数组100x100x100,我希望第一个切片是从 x=0,y=0=>x=100,y=100在x=0时包含z方向0-25上的点,并在x=100时线性变化为z=25-50。这是一种对角线切片 在numpy有没有一种有效的方法来做到这一点。理想情况下 newarray = oldarray[z> x/100*25.0 && z < 25+x/100*25.0

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

例如。 一个数组
100x100x100
,我希望第一个切片是从

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

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

    newarray = oldarray[z> x/100*25.0 && z < 25+x/100*25.0]
newarray=oldarray[z>x/100*25.0&&z<25+x/100*25.0]
您可以使用。以下是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]])

请注意,可能有更好的方法可以在不进行所有重塑的情况下完成此操作。

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

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数组
xi
yi
zi
进行切片
oldarray
,会触发高级索引。Numpy将创建一个新数组,该数组的形状与通过广播
xi
yi
zi
形成的数组的形状相同(因此,在这种情况下,由于
xi
是(100,1,1),
yi
是(1100,1)和
zi
是(100,100,25),因此输出将是(100,100,25))


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

您能举个例子吗(我不太明白),就像你期望的3x3一样?如果你认为数据是一个立方体,那么一个简单的切片就是从顶部去掉一个平面部分。好的-在二维中,它将是[6,5,4],[1,2,3],[5,7,9],[6,5,4]一个1深的切片将是[6,5,4]。但是我想要一个半对角切片,可能是[6,5,3](第2行的3)。然后是[1,2,9]。现在将其放大到100x100,从第一行开始进行倾斜切割,以包括随后的25行,在左侧,但在阵列的右侧,以25-50行为单位,并在两者之间进行插值。我已经读了几遍,但在概念上看不出它是如何工作的!是的,高级索引有点让人头疼。它与标准索引有很大不同。我将添加一个解释。。。