我想按照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。
所以,我正在寻找更有效的方法来排序数组,以传递我的评估函数。
我应该将机器学习技术应用到我的问题吗?
此外,我正在寻找任何建议,评论,想法或想法......
答案 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]]
我不是排序算法的专家,可能有更快的方法来做到这一点,但它肯定比洗牌和等待最好的更快。
该算法的解释如下:
您可以获得所有单元格的坐标(X,Y)。
您可以计算从所有坐标到中心单元格的距离 (在我的算法中,我假设矩阵是方形的,具有奇数大小 行/ col)。
您可以对距离进行排序并获取索引(而不是距离) 值)。
对X和Y坐标应用相同的排序。
对原始数组进行排序。