Python Numpy切片变量z的x、y、z数组
我有一个位置数据的3d数组,我想从中获取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
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行为单位,并在两者之间进行插值。我已经读了几遍,但在概念上看不出它是如何工作的!是的,高级索引有点让人头疼。它与标准索引有很大不同。我将添加一个解释。。。