扩展上unutbu的再回应以上,有可能自动生成分数屏蔽数组。由于每次通过循环的值都是一致的,因此每个值的分数只需计算一次。在应用分数之前和之后,在示例6x10阵列上执行此操作的方式稍显不雅。
>>> import numpy
>>> values = numpy.random.randint(6, size=(6,10))
>>> values
array([[4, 5, 1, 2, 1, 4, 0, 1, 0, 4],
[2, 5, 2, 2, 3, 1, 3, 5, 3, 1],
[3, 3, 5, 4, 2, 1, 4, 0, 0, 1],
[2, 4, 0, 0, 4, 1, 4, 0, 1, 0],
[0, 4, 1, 2, 0, 3, 3, 5, 0, 1],
[2, 3, 3, 4, 0, 1, 1, 1, 3, 2]])
>>> b = values.copy()
>>> b[ b<3 ] = -1
>>> b[ b==3 ] = 0
>>> b[ b>3 ] = 1
>>> b
array([[ 1, 1, -1, -1, -1, 1, -1, -1, -1, 1],
[-1, 1, -1, -1, 0, -1, 0, 1, 0, -1],
[ 0, 0, 1, 1, -1, -1, 1, -1, -1, -1],
[-1, 1, -1, -1, 1, -1, 1, -1, -1, -1],
[-1, 1, -1, -1, -1, 0, 0, 1, -1, -1],
[-1, 0, 0, 1, -1, -1, -1, -1, 0, -1]])
顺便说一句,this线程声称,直接在numpy的创建组合将产生比itertools 5倍左右更快的性能,虽然也许在一些可读性为代价的。
你可以发布你的循环解决方案吗?有时候更容易优化已经运行的代码,而不是试图重新发明轮子...... – mgilson
发布您的解决方案的另一个优点是它解决了含糊之处。例如,我不确定是否想要找到列出每列最多的六列(这很容易)或其他内容。 – DSM
它也可能有助于更多地了解您的数据集。例如,听起来你愿意接受来自一行的任何六个答案 - 如果每一行都是一个观察,为什么其余的被拒绝?您的数据数组可以通过某种方式进行重构来简化搜索空间吗? – abought