python - 查找 NumPy 数组中大于 N 的值的开始/停止索引范围

标签 python numpy

假设我有一个 NumPy 数组:

x = np.array([2, 3, 4, 0, 0, 1, 1, 4, 6, 5, 8, 9, 9, 4, 2, 0, 3])

对于 x >= 2 中的所有值,我需要找到连续值 x >=2 的开始/停止索引(即,一个大于或等于 2 的单个值的运行不计算在内)。然后,我对 x >= 3 重复此操作, x >=4 , ..., x >= x.max() . 输出应该是一个 NumPy 数组 三列(第一列是最小值,第二列是包含开始索引,第三列是停止索引)并且看起来像:
[[2,  0,  2],
 [2,  7, 14],
 [3,  1,  2],
 [3,  7, 13],
 [4,  7, 13],
 [5,  8, 12],
 [6, 10, 12],
 [8, 10, 12],
 [9, 11, 12]
]

天真地,我可以查看每个唯一值,然后搜索开始/停止索引。但是,这需要对 x 进行多次传递。 .完成此任务的最佳 NumPy 矢量化方法是什么?是否有不需要多次传递数据的解决方案?

更新

我意识到我还需要计算单个实例。所以,我的输出应该是:
[[2,  0,  2],
 [2,  7, 14],
 [2, 16, 16],  # New line needed
 [3,  1,  2],
 [3,  7, 13],
 [3, 16, 16],  # New line needed
 [4,  2,  2],  # New line needed
 [4,  7, 13],
 [5,  8, 12],
 [6,  8,  8],  # New line needed
 [6, 10, 12],
 [8, 10, 12],
 [9, 11, 12]
]

最佳答案

这是另一个解决方案(我认为可以改进):

import numpy as np
from numpy.lib.stride_tricks import as_strided

x = np.array([2, 3, 4, 0, 0, 1, 1, 4, 6, 5, 8, 9, 9, 4, 2, 0, 3])

# array of unique values of x bigger than 1
a = np.unique(x[x>=2])

step = len(a)  # if you encounter memory problems, try a smaller step
result = []
for i in range(0, len(a), step):
    ai = a[i:i + step]
    c = np.argwhere(x >= ai[:, None])
    c[:,0] = ai[c[:,0]]
    c =  np.pad(c, ((1,1), (0,0)), 'symmetric')

    d = np.where(np.diff(c[:,1]) !=1)[0]

    e = as_strided(d, shape=(len(d)-1, 2), strides=d.strides*2).copy()
    # e = e[(np.diff(e, axis=1) > 1).flatten()]
    e[:,0] = e[:,0] + 1 

    result.append(np.hstack([c[:,0][e[:,0, None]], c[:,1][e]]))

result = np.concatenate(result)

# array([[ 2,  0,  2],
#        [ 2,  7, 14],
#        [ 2, 16, 16],
#        [ 3,  1,  2],
#        [ 3,  7, 13],
#        [ 3, 16, 16],
#        [ 4,  2,  2],
#        [ 4,  7, 13],
#        [ 5,  8, 12],
#        [ 6,  8,  8],
#        [ 6, 10, 12],
#        [ 8, 10, 12],
#        [ 9, 11, 12]])

很抱歉没有评论每个步骤的作用——如果以后我会找时间修复它。

关于python - 查找 NumPy 数组中大于 N 的值的开始/停止索引范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60580127/

相关文章:

python - 如何触发 Windows 和 L 键 Python 热键?

python - pandas 如何使用 groupby 将 NaN 值替换为平均值

python - 如何在Python中绘制直方图?

python - 结构化 numpy 数组的索引

python - 将具有坐标和值的字典转换为二维数组

python - 如何更改 QPlainTextEdit 的光标形状(P​​yqt、PySide)

javascript - Flask 和 JavaScript 删除前确认

python - numpy 矩形的重叠率

csv - 在与真实数据相同的图中绘制多项式回归

Python/matplotlib 在直方图中显示置信度