python - 重新分配中间有最大值的二维数据
问题描述
嘿,我有一个看似随机的 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]]
我知道它不会是真正的高斯,而只是试图给出我想要的可视化。我正在考虑将二维数组排序为一个从最大值到最小值的列表,然后使用它来创建一个新的二维数组,但我不确定如何将这些值向下分布以填充我想要的矩阵。
非常感谢!
解决方案
如果将来有人看到这个并需要帮助,这里有一些关于如何有效地处理大量数据的建议。下面贴出代码。
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 命令,您可以根据您的分布函数创建您希望拥有的数据分布,在我的情况下,它是一个可以偏移的圆。
推荐阅读
- c# - 合并来自实体框架查询的两个列表会导致 500 错误
- jboss - jboss eap 7 - 使用资源适配器将消息发布到 IBM MQ
- java - 使用 ProcessBuilder 运行外部 Java 进程并给出堆大小
- python-3.x - 发送串行数据时程序卡住
- mysql - MySQL中模式的概念
- node.js - AWS DynamoDB 中的嵌套数组过滤器
- java - 使用输出目录 -o 选项时,TestRig / grun 会丢弃 java.lang.NoClassDefFoundError
- swiftui - 如何解决错误:xcode12 和 swiftui 中的“不能在不可变值上使用变异成员:'users' 是 get-only 属性”
- python - 计算字典的在线人数
- python - 使用 Keras/Tensorflow 数据加载器高效加载大型 .npy 文件 (>20GB)