使用“numpy.digitize”拆分 NumPy 数组后如何计算每个 bin 的平均值?
How to calculate mean of each bin after using `numpy.digitize` to split up a NumPy array?
我有一个输入数组,它被分成多个箱子,我想计算这些箱子的平均值。让我们假设以下示例:
>>> import numpy as np
>>> a = np.array([1.4, 2.6, 0.7, 1.1])
将其分成 bin
>>> bins = np.arange(0, 2 + 1)
>>> indices = np.digitize(a, bins)
>>> indices
array([2, 3, 1, 2])
这完全符合我的预期,您可以在此处更明确地看到:
>>> for i in range(len(bins)):
... f"bin where {i} <= x < {i + 1} contains {a[indices == i + 1]}"
...
'bin where 0 <= x < 1 contains [0.7]'
'bin where 1 <= x < 2 contains [1.4 1.1]'
'bin where 2 <= x < 3 contains [2.6]'
但是,现在我想获取每个 bin 的平均值。使用 for
循环以非 NumPy 方式执行此操作将如下所示:
>>> b = np.array([a[indices == i + 1].mean() for i in range(len(bins))])
>>> b
array([0.7 , 1.25, 2.6 ])
但是为此使用 for
循环看起来既不优雅(pythonic)也不高效,因为之后必须使用 np.array
将列表转换为 NumPy 数组。
NumPy 的方法是什么?
执行此操作的 numpy 方法是 numpy.mean() 作为函数
IIUC,这是bincount
:
np.bincount(indices-1,a)/np.bincount(indices-1)
输出:
array([0.7, 1.25, 2.6])
我有一个输入数组,它被分成多个箱子,我想计算这些箱子的平均值。让我们假设以下示例:
>>> import numpy as np
>>> a = np.array([1.4, 2.6, 0.7, 1.1])
将其分成 bin
>>> bins = np.arange(0, 2 + 1)
>>> indices = np.digitize(a, bins)
>>> indices
array([2, 3, 1, 2])
这完全符合我的预期,您可以在此处更明确地看到:
>>> for i in range(len(bins)):
... f"bin where {i} <= x < {i + 1} contains {a[indices == i + 1]}"
...
'bin where 0 <= x < 1 contains [0.7]'
'bin where 1 <= x < 2 contains [1.4 1.1]'
'bin where 2 <= x < 3 contains [2.6]'
但是,现在我想获取每个 bin 的平均值。使用 for
循环以非 NumPy 方式执行此操作将如下所示:
>>> b = np.array([a[indices == i + 1].mean() for i in range(len(bins))])
>>> b
array([0.7 , 1.25, 2.6 ])
但是为此使用 for
循环看起来既不优雅(pythonic)也不高效,因为之后必须使用 np.array
将列表转换为 NumPy 数组。
NumPy 的方法是什么?
执行此操作的 numpy 方法是 numpy.mean() 作为函数
IIUC,这是bincount
:
np.bincount(indices-1,a)/np.bincount(indices-1)
输出:
array([0.7, 1.25, 2.6])