Python 使用约束对np.array中的元素进行排序

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,]]) 正如您可能猜到的,这种排序的想法是在数组中创建一个

我想按一定的顺序对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,]])
正如您可能猜到的,这种排序的想法是在数组中创建一个对称性(以及其他一些东西,这在这里是不相关的)

我的问题是我只是在做随机洗牌,以便对数组进行排序:

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]]
我不是排序算法方面的专家,可能有更快的方法可以做到这一点,但它肯定比洗牌和等待最好的方法要快

对算法的解释如下:

  • 得到所有单元格的坐标(X,Y)

  • 计算从所有坐标到中心单元的距离 (在我的算法中,我假设矩阵是奇数大小的正方形 行/列)

  • 您可以对距离进行排序并获取索引(而不是距离) 价值观)

  • 对X和Y坐标应用相同的排序

  • 对原始数组进行排序

  • 按照排序的单元格和坐标填充数组
  • 真的没有第七步),我只是不喜欢6点就把东西留下

  • 这个数据集[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看起来很开心,所以我想这是个好答案。