我需要对一个特殊的 numpy 数组进行排序,其中大小为 19 的 block 构成一个元素,使用用户定义的函数来确定这样一个 block 的值。
第一次尝试是将数组包装在一个类中并重载 [] 运算符:
class W:
def __init__(self, filename="nn.txt"):
self.nn = array([int(i) for i in open(filename, "r").readlines()[1:]])
self.size = self.nn.size / 19
def __getitem__(self, idx):
return self.nn[idx:idx+19]
def __len__(self):
return self.size
我使用这个结构提供了一个比较运算符,它被传递给 sorted():
def avg_cmp(x, y):
return int(average(x)) - int(average(y))
u = W("nnsmall.txt")
sorted(u, cmp=avg_cmp)
但是,这种方法太慢了。
有什么建议吗?
最佳答案
你试过sorted(u, key=average)
了吗?这只会计算每列的平均值一次。
如果数组的大小总是可以被19整除而没有余数:
>>> import numpy as np
>>> n = 2
>>> u = np.array([v for v in range(19*n)])
>>> u = u.reshape(n,19)
>>> sorted(c, key=np.average)
[array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]),
array([19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37])]
关于python - 在 Python/numpy 中对容器进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6802367/