首页 > 解决方案 > 重新分配中间有最大值的二维数据

问题描述

嘿,我有一个看似随机的 2D 数据,我想重新排序。这更适用于每个像素具有特定值的图像,但概念是相同的。

我有一个看起来非常随机的大型二维数组,比如:

x = 100
y = 120
np.random.random((x,y))

我想重新分配二维矩阵,使最大值位于中心,最大值的值围绕它,使其从中心呈高斯下降。

小例子:

    output = [[0.0,0.5,1.0,1.0,1.0,0.5,0.0]
              [0.0,1.0,1.0,1.5,1.0,0.5,0.0]
              [0.5,1.0,1.5,2.0,1.5,1.0,0.5]
              [0.0,1.0,1.0,1.5,1.0,0.5,0.0]
              [0.0,0.5,1.0,1.0,1.0,0.5,0.0]]

我知道它不会是真正的高斯,而只是试图给出我想要的可视化。我正在考虑将二维数组排序为一个从最大值到最小值的列表,然后使用它来创建一个新的二维数组,但我不确定如何将这些值向下分布以填充我想要的矩阵。

非常感谢!

标签: pythonarrayssortingmultidimensional-array

解决方案


如果将来有人看到这个并需要帮助,这里有一些关于如何有效地处理大量数据的建议。下面贴出代码。

def datasort(inputarray,spot_in_x,spot_in_y):

    #get the data read
    center_of_y = spot_in_y                        
    center_of_x = spot_in_x
    M = len(inputarray[0])
    N = len(inputarray) 
    l_list = list(itertools.chain(*inputarray))    #listed data
    l_sorted = sorted(l_list,reverse=True)       #sorted listed data   

    #Reorder

    to_reorder = list(np.arange(0,len(l_sorted),1))
    x = np.linspace(-1,1,M)
    y = np.linspace(-1,1,N)
    centerx = int(M/2 - center_of_x)*0.01
    centery = int(N/2 - center_of_y)*0.01
    [X,Y] = np.meshgrid(x,y)
    R = np.sqrt((X+centerx)**2 + (Y+centery)**2)
    R_list = list(itertools.chain(*R))
    values = zip(R_list,to_reorder)
    sortedvalues = sorted(values)
    unzip = list(zip(*sortedvalues))
    unzip2 = unzip[1]
    l_reorder = zip(unzip2,l_sorted)
    l_reorder = sorted(l_reorder)
    l_unzip = list(zip(*l_reorder))
    l_unzip2 = l_unzip[1]
    sorted_list = np.reshape(l_unzip2,(N,M))
    return(sorted_list)

此代码基本上获取您的数据并将其重新排序到排序列表中。然后将其与基于循环分布的列表一起压缩。然后使用 zip 和 sort 命令,您可以根据您的分布函数创建您希望拥有的数据分布,在我的情况下,它是一个可以偏移的圆。


推荐阅读