2

我对编程比较陌生,所以如果这是一个经典而琐碎的问题,我深表歉意。我有一个100x100二维值数组,它是通过matplotlib. 在此图像中,每个单元格都有其值(范围0.01.0)和 ID(范围09999从左上角开始)。我想通过使用产生两个字典的 2x2 移动窗口对矩阵进行采样:

  • 第一个字典: key代表4个单元格的交集;该值表示具有 4 个相邻单元格 ID 的元组(见下图 -交点由 "N" 表示);
  • 第二个字典: key代表4个单元格的交集;该值表示 4 个相邻单元格的平均值(见下图)。

在下面的示例(左上图)中,其中 N 的 ID=0,第一个字典将产生 {'0': (0,1,100,101)},因为单元格的编号为 0 到 99 朝向右侧,0 到 9900,步长 = 100,向下。第二个字典会产生{'0': 0.775},因为 0.775 是 N 的 4 个相邻单元格的平均值。当然,这些字典必须具有与二维数组上的“交叉点”一样多的键。

如何实现?在这种情况下,字典是最好的“工具”吗?谢谢你们!

在此处输入图像描述

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]
            ...
4

2 回答 2

1

好吧,字典实际上可能是您的情况。

您确定您使用的 numpy.array 格式正确吗?我在 API 中找不到任何 array((int, int)) 形式。反正...

声明二维数组后该怎么做

为了让事情变得有序,让我们创建两个可以处理任何二维二维数组的函数,返回您需要的两个字典:

#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) 将其更改回字符串。

我希望这会有所帮助,现在我对数学库不是很实用,但我编写的代码应该适用于您可能想要作为输入的任何二维方阵!

于 2015-10-19T15:08:05.127 回答
1

假设data是原始numpy.array的维度drdc行和列。

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])
于 2015-10-19T15:14:39.243 回答