当前位置: 代码迷 >> python >> 如何使用2x2数组在Python中采样巨大的2D数组以创建字典? (适用于Python的模板算法)
  详细解决方案

如何使用2x2数组在Python中采样巨大的2D数组以创建字典? (适用于Python的模板算法)

热度:83   发布时间:2023-06-13 13:34:03.0

我是编程的新手,如果这是一个经典而琐碎的问题,我深表歉意。 我有一个100x100 2D值数组,可通过matplotlib绘制。 在此图像中,每个单元格都有其值(范围为0.01.0 )和ID(范围为09999从左上角开始)。 我想使用产生两个字典的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]
            ...

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

您确定使用的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方阵一起很好地工作!

假设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])