gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:52:35 25 4
gpt4 key购买 nike

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

正如您可能猜到的那样,这种排序的想法是在数组中实现对称(以及其他与此处无关的内容)。

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

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

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

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

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

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

最佳答案

请注意,您具有对称性,因为您的元素允许它(正确的数字 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 步...

关于python - 使用约束对 np.array 中的元素进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42276347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com