我有一个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]
答案 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数组oldarray
,xi
,yi
切片zi
会触发高级索引。 Numpy将创建一个新阵列,其形状与广播xi
,yi
,zi
形成的阵列相同(所以在这种情况下,因为xi
是(100,1, 1),yi
是(1,100,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]]