【问题标题】:Searching numpy array for variations搜索numpy数组的变化
【发布时间】:2018-05-10 00:24:39
【问题描述】:

我有一个一维 numpy 数组。其中的所有内容都应该是 10 的整数倍。我需要搜索它,找到我的整数倍数大于 10 的任何地方,即 20、30 等。当我找到一个时,我需要能够识别该值发生中断的索引并将它们用于某些处理。我还需要返回孤立的单个值并对它们做一些不同的事情。例如,

0、10、20、60、80、90、100

0 到 20 是一组,所以我需要把 0 和 20 拿回来做一些事情,同样 80 到 100 是一组,应该发生同样的情况。 60 虽然只是它自己的一个值,所以我需要看到它只是一个孤立的单个值并对其进行一些单独的处理,然后在 80 处恢复以获得正确的结果。

一直在尝试用 numpy 找出一种合理的方法来做到这一点,但没有想出太多。数据集非常大,所以效率越高越好。理论上,集合内不应该有重复的值,并且随着我们在数组中前进,它们应该总是进步。感谢您提前提供任何帮助。

【问题讨论】:

标签: python arrays sorting numpy


【解决方案1】:

您当然可以将这些值分组到所需的集合中。有几种方法可以做到这一点,例如闭包:

import itertools as it

def gn(init=0):
    _x = init
    _count = 0
    def fn(x):
        nonlocal _count, _x
        _count += x - _x > 10
        _x = x
        return _count
    return fn

In []:
x = [0, 10, 20, 60, 80, 90, 100]
[list(g) for k, g in it.groupby(x, gn())]

Out[]:
[[0, 10, 20], [60], [80, 90, 100]]

或者类似的类:

class G:
    def __init__(self, init=0):
        self._x = init
        self._count = 0
    def __call__(self, x):
        self._count += x - self._x > 10
        self._x = x
        return self._count

In []:
x = [0, 10, 20, 60, 80, 90, 100]
[list(g) for k, g in it.groupby(x, G())]

Out[]:
[[0, 10, 20], [60], [80, 90, 100]]

然后您可以迭代这些组,然后 len() == 1 做一些不同的事情。

【讨论】:

  • 这个方法听起来最好,但是当我运行它时它告诉我:` File "test.py", line 21 nonlocal _count, _x ^ SyntaxError: invalid syntax'
  • nonlocal 仅在 Py3 中添加。您必须使用 Py2.X。只需使用class
  • 不确定错误,但让它作为一个类工作,所以我走那条路。非常快,谢谢!
猜你喜欢
  • 2012-10-22
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2016-05-24
  • 2016-07-31
  • 2018-05-27
相关资源
最近更新 更多