使用约束

时间:2017-02-16 14:11:35

标签: python arrays sorting numpy machine-learning

我想按照f.i的某个顺序对np.array进行排序。我有输入数组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,]])

正如您可能猜到的,这种排序的想法是在数组中创建对称(以及其他与此无关的东西)。

我的问题是我正在做随机shuffle以对数组进行排序:

iNumbers = 0
while !symmetry(a) and iNumbers != 3000:
      np.random.shuffle(a.flat)
      iNumbers += 1

如果元素的排列符合条件,则symmetry函数为True。

所以,我正在寻找更有效的方法来排序数组,以传递我的评估函数。

我应该将机器学习技术应用到我的问题吗?

此外,我正在寻找任何建议,评论,想法或想法......

1 个答案:

答案 0 :(得分: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. 您可以获得所有单元格的坐标(X,Y)。

  2. 您可以计算从所有坐标到中心单元格的距离 (在我的算法中,我假设矩阵是方形的,具有奇数大小 行/ col)。

  3. 您可以对距离进行排序并获取索引(而不是距离) 值)。

  4. 对X和Y坐标应用相同的排序。

  5. 对原始数组进行排序。

  6. 按照排序的单元格和坐标填充数组。
  7. 真的没有第7步),我只是不想把事情留在6 ...