问题在于x[1,x[0,:]+1]
,第 2 轴的索引:x[0,:]+1
是[1 2 3 4 5 6 7 8 9 10]
,其中索引10
大于 x 的维度。
在 的情况下x[1,x[0,:]-1]
,第二个轴的索引是[-1 0 1 2 3 4 5 6 7 8 9]
,你最终得到[9 0 1 2 3 4 5 6 7 8]
,9
最后一个元素也是,索引为-1
。倒数第二个元素的索引是-2,依此类推。
使用np.where((x[0,:]<5)&(x[0,:]>0),x[1,x[0,:]-1],x[1,:])
和x[0,:]=[0 1 2 3 4 5 6 7 8 9]
,本质上是第一个单元格被采用,x[1,:]
因为x[0,0]
是 0 并且x[0,:]<5)&(x[0,:]>0
是False
。接下来的四个元素取自x[1,x[0,:]-1]
. 其余均来自x[1,:]
。最后的结果是[0 0 1 2 3 4 5 6 7 8]
对于只有 1 个单元格的滑动窗口,它可能看起来没问题,但它会让你大吃一惊:
>>> np.where((x[0,:]<5)&(x[0,:]>0),x[1,x[0,:]-2],x[1,:])
array([0, 9, 0, 1, 2, 5, 6, 7, 8, 9])
当您尝试通过两个单元格的窗口移动它时。
对于这个特定的问题,如果我们想把所有的东西都放在一行中,这样可以:
>>> for i in [1, 2, 3, 4, 5, 6]:
print hstack((np.where(x[1,x[0,:]-i]<x[0, -i], x[1,x[0,:]-i], 0)[:5], x[0,5:]))
[0 0 1 2 3 5 6 7 8 9]
[0 0 0 1 2 5 6 7 8 9]
[0 0 0 0 1 5 6 7 8 9]
[0 0 0 0 0 5 6 7 8 9]
[0 0 0 0 0 5 6 7 8 9]
[0 0 0 0 0 5 6 7 8 9]
编辑:现在我更好地理解了你原来的问题,基本上你想要一个二维数组并计算每个单元格周围的 N*N 单元格平均值。这很常见。首先,您可能希望将 N 限制为奇数,否则难以定义单元格周围的 2*2 平均值。假设我们想要 3*3 的平均值:
#In this example, the shape is (10,10)
>>> a1=\
array([[3, 7, 0, 9, 0, 8, 1, 4, 3, 3],
[5, 6, 5, 2, 9, 2, 3, 5, 2, 9],
[0, 9, 8, 5, 3, 1, 8, 1, 9, 4],
[7, 4, 0, 0, 9, 3, 3, 3, 5, 4],
[3, 1, 2, 4, 8, 8, 2, 1, 9, 6],
[0, 0, 3, 9, 3, 0, 9, 1, 3, 3],
[1, 2, 7, 4, 6, 6, 2, 6, 2, 1],
[3, 9, 8, 5, 0, 3, 1, 4, 0, 5],
[0, 3, 1, 4, 9, 9, 7, 5, 4, 5],
[4, 3, 8, 7, 8, 6, 8, 1, 1, 8]])
#move your original array 'a1' around, use range(-2,2) for 5*5 average and so on
>>> movea1=[a1[np.clip(np.arange(10)+i, 0, 9)][:,np.clip(np.arange(10)+j, 0, 9)] for i, j in itertools.product(*[range(-1,2),]*2)]
#then just take the average
>>> averagea1=np.mean(np.array(movea1), axis=0)
#trim the result array, because the cells among the edges do not have 3*3 average
>>> averagea1[1:10-1, 1:10-1]
array([[ 4.77777778, 5.66666667, 4.55555556, 4.33333333, 3.88888889,
3.66666667, 4. , 4.44444444],
[ 4.88888889, 4.33333333, 4.55555556, 3.77777778, 4.55555556,
3.22222222, 4.33333333, 4.66666667],
[ 3.77777778, 3.66666667, 4.33333333, 4.55555556, 5. ,
3.33333333, 4.55555556, 4.66666667],
[ 2.22222222, 2.55555556, 4.22222222, 4.88888889, 5. ,
3.33333333, 4. , 3.88888889],
[ 2.11111111, 3.55555556, 5.11111111, 5.33333333, 4.88888889,
3.88888889, 3.88888889, 3.55555556],
[ 3.66666667, 5.22222222, 5. , 4. , 3.33333333,
3.55555556, 3.11111111, 2.77777778],
[ 3.77777778, 4.77777778, 4.88888889, 5.11111111, 4.77777778,
4.77777778, 3.44444444, 3.55555556],
[ 4.33333333, 5.33333333, 5.55555556, 5.66666667, 5.66666667,
4.88888889, 3.44444444, 3.66666667]])
我认为您不需要将 2D 阵列展平,这会导致混乱。此外,如果您想以不同方式处理边缘元素而不是仅仅将它们修剪掉,请考虑np.ma
在“移动原始数组”步骤中使用蒙版数组。