【问题标题】:Complex NumPy Array Manipulation复杂的 NumPy 数组操作
【发布时间】:2020-11-13 19:21:22
【问题描述】:

我有两个 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 处元素的平均值。 Blue 类别也同样如此。

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

【问题讨论】:

    标签: arrays numpy indexing include


    【解决方案1】:

    由于源数组的类型,您使用 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') - 根据上面的结果,通过key生成分组 (红色 / 蓝色)。

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

    4. 结果是一个系列

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

    【讨论】:

    • 谢谢!实际上,df1 中最后一列中的 0: 'Red' 和 1: 'Blue' 来自一个预定义的字典,我只需要参考它即可。我想知道是否也可以使用可选参数找出结果,在该参数中我会指定我想要红色或蓝色或预定义字典中任何其他颜色的平均值?谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 2018-11-08
    • 2016-06-06
    • 2016-04-14
    • 2018-11-30
    • 2020-10-28
    • 2011-05-22
    相关资源
    最近更新 更多