如何计算由一组索引定义的不同窗口大小的NumPy数组的移动平均值?

2024-04-23 20:39:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在二维数组(轴=1)中,根据一维数组中的一个范围求平均值的最python方法是什么?在

我试着平均环境变量数组(我的2d数组)基于每2个纬度(我的id数组)。我有一个纬度数组从-33.9到29.5。我想把环境变量平均在-34到30之间每2度。在

每2度内的元素数量可能不同,例如:

arr = array([[5,3,4,5,6,4,2,4,5,8],
             [4,5,8,5,2,3,6,4,1,7],
             [8,3,5,8,5,2,5,9,9,4]])

idx = array([1,1,1,2,2,3,3,3,3,4])

然后我将根据idx[0:3]idx[3:9]idx[9]计算arr中的值的平均值。在

我想得到一个结果:

^{pr2}$

Tags: 方法id元素数量环境变量数组array平均值
2条回答

您可以使用^{}函数。对于您的索引示例0:3, 3:9, 9,如下所示:

np.hsplit(arr, [3, 9])

这将为您提供一个数组列表:

^{pr2}$

然后,您可以计算平均值,如下所示:

^{3}$

并将其转换回数组:

np.vstack(m).T

@Andyk已经在他的帖子中解释了如何使用一系列指数来计算平均值。
我将提供一个获得这些指数的解决方案。在

以下是一种通用方法:

from typing import Optional

import numpy as np


def get_split_indices(array: np.ndarray,
                      *,
                      window_size: int,
                      start_value: Optional[int] = None) -> np.ndarray:
    """
    :param array: input array with consequent integer indices
    :param window_size: specifies range of indices
    which will be included in a separate window
    :param start_value: from which the window will start
    :return: array of indices marking the borders of the windows
    """
    if start_value is None:
        start_value = array[0]

    diff = np.diff(array)
    diff_indices = np.where(diff)[0] + 1

    slice_ = slice(window_size - 1 - (array[0] - start_value) % window_size,
                   None,
                   window_size)

    return diff_indices[slice_]

用法示例:

用示例数据进行检查:

^{pr2}$

您可以获得这样分隔不同窗口的索引:

^{3}$

使用此函数,您还可以指定不同的窗口大小:

# indices:                     7        11               17
idx = np.array([0,1,1,2,2,3,3, 4,5,6,7, 8,9,10,11,11,11, 12,13])

get_split_indices(idx,
                  window_size=4,
                  start_value=0)
>>> array([ 7, 11, 17])

以及不同的起始值:

# indices:         1            7      10     13              18
idx = np.array([0, 1,1,2,2,3,3, 4,5,6, 7,8,9, 10,11,11,11,12, 13])
get_split_indices(idx,
                  window_size=3,
                  start_value=-2)
>>> array([ 1,  7, 10, 13, 18])

注意,默认情况下,我将数组的第一个元素作为起始值。在

相关问题 更多 >