【问题标题】:python - find positive/negative/positive pattern in numpy arraypython - 在numpy数组中找到正/负/正模式
【发布时间】:2021-06-10 13:56:09
【问题描述】:

numpy 是否有一种简单的方法来确定数组是否具有如下所示的模式:(正数后跟负数后跟正数)?

例子:

myArray = np.array([5, 5, 3, 6, -2, -5, 4, 9])
myArray2 = np.array([5, 5, 3, 6, 8, 4, -5, -8])

if foundPatern(myArray):  # True
if foundPatern(myArray2): # False

【问题讨论】:

  • 纯 numpy 解决方案:check = np.all((x[np.hstack((True,np.diff(x>=0)))]>=0)==[True,False,True]) 其中x 是您的数组。我只保留符号更改的值并检查符号是否确实是Positive Negative Positive

标签: python numpy


【解决方案1】:

有一个 numpy 内置函数可以根据符号将数组的每个元素转换为 1、0、-1。转换符号后,您可以轻松地使用itertools.groupby 完成此任务:

from itertools import groupby
import numpy as np


def foundPattern(lst):
    g = list(groupby(np.sign(lst)))
    return (len(g)==3 and g[0][0]==1.0)

它的工作原理如下:

  1. 数组中的项目根据其符号(+ 或 -)进行分组
  2. 如果恰好存在 3 个组并且第一个是一组阳性,则返回 True;在所有其他情况下,您返回False

请注意,您尚未指定如何处理边缘情况(例如,数组中的 0),因此我不会尝试以任何方式处理它们。但是请注意它们确实存在。另一个极端情况的例子可能是NaN

【讨论】:

  • 这太完美了!直到现在才知道 itertools。感谢您的详细解释! :)
  • @FarhanAhmad 那么你最好看看,因为itertools 是一个非常有用的库。干杯。
  • 有一个 numpy 内置的:np.sign。可以将函数的第一行修改为:g = list(groupby(np.sign(lst)))
  • @SNygard 那更好!随意编辑,我不在 pc atm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 2017-11-09
  • 2017-07-18
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多