numpy - numpy数组中的条件均值?
问题描述
我有一个名为“距离”的 numpy 数组,如下所示:
[[ 5. 1. 1. 1. 2. 1. 3. 1. 1. 1.]
[ 5. 4. 4. 5. 7. 10. 3. 2. 1. 1.]
[ 3. 1. 1. 1. 2. 2. 3. 1. 1. 0.]
[ 6. 8. 8. 1. 3. 4. 3. 7. 1. 1.]
[ 4. 1. 1. 3. 2. 1. 3. 1. 1. 1.]
[ 8. 10. 10. 8. 7. 10. 9. 7. 1. 1.]
[ 1. 1. 1. 1. 2. 10. 3. 1. 1. 0.]
[ 2. 1. 2. 1. 2. 1. 3. 1. 1. 0.]
[ 2. 1. 1. 1. 2. 1. 1. 1. 5. 2.]
[ 4. 2. 1. 1. 2. 1. 2. 1. 1. 1.]]
我想通过这样的平均值制作一个新的 3*9 numpy 数组:
- 如果最后一列为 0,则定义一个数组 c0 (1*9),它是所有此类行的平均值,其中最后一列为 0,其中每列是此类行的列的平均值。
- 如果最后一列为 1,则定义一个数组 c1 (1*9),它是所有此类行的平均值,其中最后一列为 1,其中每列是此类行的列的平均值。
- 如果最后一列为 2,则定义一个数组 c2 (1*9),它是所有此类行的平均值,其中最后一列为 2,其中每列是此类行的列的平均值。
发布此操作后,我正在执行 hstack 以获得最终的 3*9 数组。我确信这是一个长期的方法,但仍然是错误的。
代码:
c0=distances.mean(axis=1)
final = np.hstack((c0,c1,c2))
这样做我得到 1*10 数组,其中每一列是距离数组中每一列的平均值,但是我无法找到一种方法来做到这一点,即仅当最后一列行仅为 0 时才取平均值?
解决方案
和pandas
会直截了当pandas
-
import pandas as pd
df = pd.DataFrame(distances)
df_out = df.groupby(df.shape[1]-1).mean()
df_out['ID'] = df_out.index
out = df_out.values
和NumPy
使用自定义函数
对于特定于 NumPy 的,我们可以使用groupbycol
(执行基于组的求和)并因此解决我们的案例,如下所示 -
sums = groupbycol(distances, assume_sorted_col=False, colID=-1)
out = sums/np.bincount(distances[:,-1]).astype(float)[:,None]
和matrix-multiplication
mask = distances[:,-1,None] == np.arange(distances[:,-1].max()+1)
out = mask.T.dot(distances)/mask.sum(0)[:,None].astype(float)
推荐阅读
- php - 如何从 Goutte 获取响应状态代码
- html - 将coldfusion / html页面呈现为docx扩展而不是doc扩展时出现问题
- python - 在 Python 中使用递归时出现 UnboundLocalError?
- r - 使用 R 中的模板字符串将因子转换为字符串
- visual-studio-code - VSCode 多语言扩展不加载第二语言的语法
- mongoose - 猫鼬 findByIdUpdate 已弃用
- python - 在类实例化时返回不同的类型?
- android - AndroidX 偏好库 DropDownPreferences 不适用于 API < 24
- python-3.x - UDATE:如何将一组值重复分配给时间序列?
- concourse - 如何从另一个资源的目录执行 Concourse 任务脚本?