我有一个数组:
import numpy as np
array = np.array([[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 0, 2, 22, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1],
[ 1, 0, 1, 34, 99, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1],
[ 1, 0, 5, 11, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1],
[ 1, 0, 6, -5, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1],
[ 1, 0, 88, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1],
[ 1, 1, 333, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
我想得到我所在地区某个部分的平均值。区域中心位于索引[3][4]
,每个方向前进5步。
我认为一种方法是为感兴趣的区域创建一个子数组,并在该子数组上使用numpy.mean
。我怎么能创建那个子数组?
我也对其他方法或想法感兴趣。
答案 0 :(得分:2)
这是一个长篇版本,引导您完成以下步骤:
def center_mean(array, row, col, size):
# Use min & max to handle edges
row_min = max(0, row - size)
row_max = min(len(array), row + size)
col_min = max(0, col-size)
col_max = min(len(array[0]), col + size)
# Get just the rows we want:
sub_rows = array[row_min:row_max + 1]
total = 0.0
for row in sub_rows:
# Now take just the cols we want:
new_row = row[col_min:col_max + 1]
total += sum(new_row)
return total / (size*2 + 1)**2
print(center_mean(array, 3, 4, 5))
答案 1 :(得分:1)
这样做的简单方法是制作数组的矩形切片:
>>> span = 5
>>> a[0:3+span+1, 0:4+span+1]
array([[ 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 4, 3, 1, 1, 1, 1, 1],
[ 1, 0, 2, 22, 0, 1, 0, 0, 0],
[ 1, 0, 1, 34, 99, 1, 1, 0, 1],
[ 1, 0, 5, 11, 0, 1, 1, 0, 1],
[ 1, 0, 6, -5, 0, 1, 1, 0, 1],
[ 1, 0, 88, 0, 0, 1, 0, 0, 0],
[ 1, 1, 333, 1, 1, 1, 1, 1, 1]])
当然,其意思是:
>>> np.mean(a[0:3+5, 0:4+5])
8.9305555555555554
要获得圆形切片,您可以使用:
i, j = np.indices(a.shape)
a[((i-3)**2 < 25) & ((j-4)**2 < 25)]
答案 2 :(得分:1)
i,j=3,4
m = array[max(0,i-5):i+5,max(0,j-5):j+5].mean()
注意:对于你的中心(3,4),子区域实际上是形状(8,9)而不是(11,11),因为它在边界处被切断。