首页 > 解决方案 > 复杂的 NumPy 数组操作

问题描述

我有两个 numpy 数组:例如

np.array_1([
[5,2,0]
[4,3,0]
[4,2,0]
[3,2,1]
[4,1,1]
])

np.array_2([
[5,2,10]
[4,2,52]
[3,2,80]
[1,2,4]
[5,3,6]
])

在 np.array_1 中,索引 2 处的 0 和 1 代表两个不同的类别。为了论证起见,说 0 = 红色和 1 = 蓝色。

因此,如果前两个元素在两个 numpy 数组中匹配,我需要按类别平均 np.array_2 中的第三个元素。例如,[5,2,10] 和 [4,2,52] 都匹配类别 0,即红色。该代码将返回 Red 类别的索引 2 处元素的平均值。它也将对蓝色类别执行相同的操作。

我不知道从哪里开始,欢迎任何想法。

标签: arraysnumpyindexinginclude

解决方案


由于源数组的类型,您使用Numpy标签标记了您的帖子,但是使用Pandas生成结果更加容易和直观。

从将两个数组转换为pandasonic DataFrames 开始。在转换第一个数组时,还将最后一列中的01转换为RedBlue

import pandas as pd

df1 = pd.DataFrame(array_1, columns=['A', 'B', 'key'])
df1.key.replace({0: 'Red', 1: 'Blue'}, inplace=True)
df2 = pd.DataFrame(array_2, columns=['A', 'B', 'C'])

然后,要生成结果,请运行:

result = df2.merge(df1, on=['A', 'B']).groupby('key').C.mean().rename('Mean')

结果是:

key
Blue    80
Red     31
Name: Mean, dtype: int32

细节:

  1. df2.merge(df1, on=['A', 'B'])- 生成:

       A  B   C   key
    0  5  2  10   Red
    1  4  2  52   Red
    2  3  2  80  Blue
    

    同时消除不属于任何组的行(既不是Red也不是Blue)。

  2. groupby('key')- 根据上述结果,按键生成组 (红色/蓝色)。

  3. C.mean()- 最后一步是取C列(来自每个组)并计算其平均值

  4. 结果是一个系列

    • index - 分组键,
    • value - 为相应组计算的值。
  5. rename('Mean')- 将名称从源列名称 ( C ) 更改为更有意义的平均值


推荐阅读