【发布时间】:2018-04-03 19:07:17
【问题描述】:
假设我有两个大小相同的数组A 和B。为了确定性,我们假设它们是二维的。两个数组中的值代表一些数据,这些数据应该平滑地依赖于数组中的位置。但是,A 中的一些值已与B 中的相应值交换。我想扭转这种交换,但我很难找到一个标准来告诉我什么时候应该交换两个值。
一个例子应该会有所帮助。这是一些创建两个这样的数组并随机交换它们的一些元素的python代码
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import random
### create meshgrid ###
x = np.linspace(-10,10,15);
y = np.linspace(-10,10,11);
[X,Y] = np.meshgrid(x,y);
### two sufficiently smooth functions on the meshgrid ###
A = -X**2-Y**2;
B = X**2-Y**2-100;
### plot ###
ax=plt.subplot(2,2,1)
im1=ax.imshow(A,extent=[-10, 10, -10, 10])
ax.set_title('A')
ax2=plt.subplot(2,2,2)
im2=ax2.imshow(B,extent=[-10, 10, -10, 10])
ax2.set_title('B')
### randomly exchange a few of the elements of A and B ###
for i in np.arange(0,15):
for j in np.arange(0,11):
randNumb = random.random();
if randNumb>0.8:
mem=A[j,i];
A[j,i] = B[j,i];
B[j,i] = mem;
### plot for comparison ###
ax=plt.subplot(2,2,3)
im1=ax.imshow(A,extent=[-10, 10, -10, 10])
ax2=plt.subplot(2,2,4)
im2=ax2.imshow(B,extent=[-10, 10, -10, 10])
plt.show()
这将导致以下情节:
上面两个图是原始数组 A 和 B,下面两个是改组后的版本。现在的练习是反转这个过程,即从打乱后的版本创建原始数组 A 和 B。
关于我所说的“平滑”的说明。当然,该算法只有在原始数据实际上足够平滑时才有效,这意味着一个数组中的相邻数据点对于所有点的值都足够接近。一个解决方案可能会假设是这种情况。
还要注意,在上面的示例中,这个练习非常容易通过肉眼完成。我在实现这一点时遇到的问题是找到一个好的标准来告诉我何时切换到单元格。
注意,反向转换当然可以重新标记 A 和 B。
【问题讨论】:
-
标准应该可能是图像中差异(的绝对值)的总和。只要交换减少了差异的总和,直到您不能再进行交换,您就可以使用一些效率较低的算法交换值对,但我不确定这是否一定会收敛。
标签: python arrays algorithm sorting