Python 使用约束对np.array中的元素进行排序
我想按一定的顺序对np.array进行排序f.I.我有一个输入数组a:Python 使用约束对np.array中的元素进行排序,python,arrays,sorting,numpy,machine-learning,Python,Arrays,Sorting,Numpy,Machine Learning,我想按一定的顺序对np.array进行排序f.I.我有一个输入数组a: a = np.array([[ 2, 2, 1,], [ 3, 3, 3,], [ 2, 3, 2,]]) 我想得到输出的结果: b = np.array([[ 2, 3, 2,], [ 3, 1, 3,], [ 2, 3, 2,]]) 正如您可能猜到的,这种排序的想法是在数组中创建一个
a = np.array([[ 2, 2, 1,],
[ 3, 3, 3,],
[ 2, 3, 2,]])
我想得到输出的结果:
b = np.array([[ 2, 3, 2,],
[ 3, 1, 3,],
[ 2, 3, 2,]])
正如您可能猜到的,这种排序的想法是在数组中创建一个对称性(以及其他一些东西,这在这里是不相关的)
我的问题是我只是在做随机洗牌,以便对数组进行排序:
iNumbers = 0
while !symmetry(a) and iNumbers != 3000:
np.random.shuffle(a.flat)
iNumbers += 1
其中,对称性
如果元素的排列符合标准,则函数为真
因此,我正在寻找更有效的方法对数组进行排序,以便通过我的求值函数
我是否应该将机器学习技术应用于我的问题
另外,我正在寻找任何建议、评论、想法或想法……请注意,对称是因为元素允许对称(正确的数字3、2和1表示对称是可能的)。假设你考虑到这一点,你所寻找的是一种径向排序。以下算法会执行此操作:
import numpy as np
def sortRadially(a):
X, Y = np.indices(a.shape, dtype="float")
c = int(a.shape[0]/2)
d = np.sqrt((c-X)**2 + (c-Y)**2)
fd = d.flatten()
fX = X.flatten()
fY = Y.flatten()
argD = fd.argsort()
nX = fX[argD].astype(int)
nY = fY[argD].astype(int)
fa = a.flatten()
sa = a.copy()
fa.sort()
for i in range(nX.shape[0]):
a[nX[i], nY[i]] = fa[i]
return a
a = np.array([[ 2, 2, 1,],
[ 3, 3, 3,],
[ 2, 3, 2,]])
myown = np.random.randint(0, 100, (9, 9))
print("Your test:")
print(sortRadially(a))
print("")
print("My test:")
print(sortRadially(myown))
结果是:
Your test:
[[3 2 3]
[2 1 2]
[3 2 3]]
My test:
[[97 95 91 78 60 73 84 92 98]
[93 78 55 44 30 34 55 80 92]
[84 45 22 15 10 17 23 44 88]
[71 42 12 7 2 7 16 42 73]
[69 28 10 2 0 1 10 28 66]
[72 44 13 5 1 3 14 38 77]
[87 49 19 14 8 19 24 52 91]
[95 83 48 43 33 39 52 79 94]
[98 94 83 73 67 71 91 96 99]]
我不是排序算法方面的专家,可能有更快的方法可以做到这一点,但它肯定比洗牌和等待最好的方法要快
对算法的解释如下:
这个数据集[1,1,1,1,1,1,1,2,2,3]是什么?我认为这个方法不包括这些;-)@保尔·帕泽尔(对;)这个例子与对称无关。这只是排序类型的自然结果(如果可能的话)。在任何情况下,作为对任何感兴趣的人的一般说明,我假设中心是最小的值。如果点是对称的,也可以用另一种方式进行排序。要做到这一点,只需将所做的排序反向到距离(例如:
fd.argsort()[:-1][:n]
)。那么这一个如何呢[1]+7*[2]+[3]
?你会得到中间的权利,但其中一个角落将是错误的,无论你排序的方向是什么。@PaulPanzer那一个我不知道你会如何期待对称。唯一不重复的元素必须位于中心。在您的示例中,1或3都无法反射到任何一侧。但请注意,这只是问题的快速确定解决方案。可以插入其他约束。例如,没有指定对称轴,因此我假设必须遵守所有对称轴。但为什么不只解X、Y或对角对称的对称性呢?我只是给了OP一个先例,有很多可能的方法解决这个问题。你是对的,我没有看到自上而下的对称性,仍然是4x[1]+[2]+4x[3]。我只是觉得排序和对称在这里不是一回事。在3x3网格上,您可能会观察到一些重叠,但越大,您的运气就越差。但没关系,OP看起来很开心,所以我想这是个好答案。