问题描述
我是编程的新手,如果这是一个经典而琐碎的问题,我深表歉意。
我有一个100x100
2D值数组,可通过matplotlib
绘制。
在此图像中,每个单元格都有其值(范围为0.0
到1.0
)和ID(范围为0
到9999
从左上角开始)。
我想使用产生两个字典的2x2移动窗口对矩阵进行采样:
- 第一个字典:键代表4个单元格的交集; 该值表示具有4个相邻单元格ID的元组(请参见下图- 交集由“ N”表示 );
- 第二字典:键代表4个单元格的交集; 该值表示4个相邻单元的平均值(请参见下图)。
在下面的示例( 左上图 )中,N的ID = 0,第一个字典将产生{'0': (0,1,100,101)}
因为单元格的编号分别是:右侧的0到99和0到9900 ,步进= 100,向下。
第二个字典将产生{'0': 0.775}
,因为0.775是N的四个相邻单元的平均值。当然,这些字典必须具有与2D数组上的“交集”一样多的键。
如何做到这一点? 在这种情况下,词典是最好的“工具”吗? 感谢大伙们!
PS:我尝试了自己的方式,但是我的代码不完整,错误,并且无法解决:
a=... #The 2D array which contains the cell values ranging 0.0 to 1.0
neigh=numpy.zeros(4)
mean_neigh=numpy.zeros(10000/4)
for k in range(len(neigh)):
for i in a.shape[0]:
for j in a.shape[1]:
neigh[k]=a[i][j]
...
1楼
好吧,字典实际上可能就是您的情况。
您确定使用的numpy.array格式正确吗? 我在API中找不到任何array((int,int))形式。 无论如何...
声明2D数组后该怎么办
为了使事情井井有条,让我们做两个可以与任何正方形2D数组一起使用的函数,返回您需要的两个字典:
#this is the one that returns the first dictionary
def dictionarize1(array):
dict1 = {}
count = 0
for x in range(len(array[0]) - 1) :
for y in range(len(array[0]) - 1):
dict1[count] = [array[x][y], array[x][y+1], array[x+1][y], array[x + 1][y+1]]
count = count + 1
return dict1
def dictionarize2(array):
dict2 = {}
counter = 0
for a in range(len(array[0]) - 1) :
for b in range(len(array[0]) - 1):
dict2[counter] = (array[a][b] + array[a][b+1] + array[a+1][b] + array[a + 1][b+1])/4
counter = counter + 1
return dict2
#here's a little trial code to see them working
eighties = [[2.0, 2.2, 2.6, 5.7, 4.7], [2.1, 2.3, 2.3, 5.8, 1.6], [2.0, 2.2, 2.6, 5.7, 4.7],[2.0, 2.2, 2.6, 5.7, 4.7],[2.0, 2.2, 2.6, 5.7, 4.7]]
print("Dictionarize1: \n")
print(dictionarize1(eighties))
print("\n\n")
print("Dictionarize2: \n")
print(dictionarize2(eighties))
print("\n\n")
与第一个代码相比,我更喜欢使用整数作为键,因为python将打印在这种情况下排序的字典(字典按定义是未排序的,但是如果它们具有int键,Python将按键将其打印出来)。 但是,您可以像以前一样使用str(count)将其更改回字符串。
我希望这会有所帮助,因为我现在对数学库不是很实用,但是我编写的代码应该可以与您要输入的任何2D方阵一起很好地工作!
2楼
假设data
是原始的numpy.array
,行和列的维度为dr
和dc
。
dr = data.shape[0]
dc = data.shape[1]
您可以将Keys
成为一个函数,该函数返回感兴趣的索引和Values
作为具有4个相邻像元的计算平均值的列表。
在这种情况下, Keys
等于:
def Keys(x):
xmod = x + (x+1)/dc # dc is in scope
return [xmod, xmod + 1, xmod + dc, xmod + 1 + dc]
因为不包括最后一行和最后一列,所以“ Values
”的维等于dr-1 * dc-1
。
我们可以将其计算为移动平均值,然后再调整为1D
(来自启发):
Values = ((d[:-1,:-1] + d[1:,:-1] + d[:-1,1:] + d[1:,1:])/4).reshape((dr-1)*(dc-1))
例:
dr = 3
dc = 5
In: np.array(range(dc*dr)).reshape((dr, dc)) # data
Out:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
In: [Keys(x) for x in range((dr-1)*(dc-1))]
Out:
[[0, 1, 5, 6],
[1, 2, 6, 7],
[2, 3, 7, 8],
[3, 4, 8, 9],
[5, 6, 10, 11],
[6, 7, 11, 12],
[7, 8, 12, 13],
[8, 9, 13, 14]]
In: Values
Out: array([ 3, 4, 5, 6, 8, 9, 10, 11])