【问题标题】:Sorting elements in a np.array using constrains使用约束对 np.array 中的元素进行排序
【发布时间】:2017-07-05 16:56:18
【问题描述】:

我想按特定顺序对 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

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

所以,我正在寻找更有效的方法来对数组进行排序,以便通过我的评估函数。

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

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

【问题讨论】:

    标签: python arrays sorting numpy machine-learning


    【解决方案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. 您计算所有坐标到中心单元的距离 (在我的算法中,我假设矩阵是奇数大小的正方形 行/列)。

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

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

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

    6. 按照已排序的单元格和坐标填充数组。
    7. 真的没有第 7 步),我只是不喜欢把东西留在 6 点...

    【讨论】:

    • 这个数据集 [1, 1, 1, 1, 1, 1, 2, 2, 3] 怎么样?我不认为这种方法涵盖了这一点;-)
    • @PaulPanzer True;) 该示例与对称性无关。这只是排序类型的自然结果(如果可能的话)。无论如何,作为对任何感兴趣的人的一般说明,我假设中心是最小值。如果该点是对称的,则也可以采用其他方式进行排序。为此,只需反转对距离的排序(例如:fd.argsort()[::-1][:n]))。
    • 这个怎么样然后[1] + 7 * [2] + [3]?你会得到正确的中心,但无论你向哪个方向排序,其中一个角都会出错。
    • @PaulPanzer 那一个我不确定你会如何期望对称。唯一没有重复的元素必须在中心。在您的示例中,1 或 3 都无法反射到任何一侧。但请注意,这只是问题的快速确定性解决方案。可以插入其他约束。例如,没有指定对称轴,所以我假设必须尊重所有这些轴。但为什么不只求解 X 或 Y 或对角线对称的对称性呢?我只是给了 OP 一个良好的开端,有很多可能的方法来解决这个问题。
    • 你说得对,我没有看到自上而下的对称性,仍然有 4 x [1] + [2] + 4 x [3]。我只是认为排序和对称在这里真的不是一回事。在 3x3 网格上,您可能会观察到一些重叠,但您走的越大,您的运气就越差。不过没关系,OP似乎很高兴,所以我想这是一个很好的答案。
    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2023-04-10
    • 2012-12-26
    • 2019-05-08
    相关资源
    最近更新 更多