问题出在
x [1,x [0,:] + 1]
上,即第二个轴的索引:
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]
。
这可能看起来对于仅有一个单元格的滑动窗口来说还可以,但它会给你带来惊喜。
>>> 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
创建掩码数组。
vector2[i]
,还是这段代码中有错误? - Daniel