具有相同值的行的numpy平均值

时间:2017-06-26 13:30:19

标签: python arrays numpy

我一直在寻找好几个小时,无法找到一个好的解决方案。我需要一个快速的方法,用numpy来平均一个大的形状阵列(alotofrows,3)。

numpy数组看起来像:

[[1.0,  1.0, 3.6678965], [1.0,  2.0, -3.6678965], [1.0,  3.0, 5.6678965] ....]

在四行之后,哇的第一个条目增加+1,所以我有四行,每行有相同的第一个元素(1,1,1,1,2,2,2,2,3,3, 3,3 ...,N,N,N,N)。 我如何使用numpy来平均每行的最后一个元素与该行的第一个元素具有相同的数字? Hopefuly没有使用循环。

  

[n,b,c]:我需要检查相同的n并平均c的值   这些行。

背景:数组表示FEA-Sim输出的[ElementLabel,integrationPoint,Stressvalue]。每个元素的应力在4个积分点计算。这就是为什么ElementLabel是相同的4倍。我想计算每个元素的Stressvalue的平均值,最后获得所有元素的最高平均值。这是一个非常大的数组。

我确定它非常简单,但我自己无法找到解决方案:)

编辑:这是我的尝试:

for i in range(0, len(elArray)):       
    tmp_avg=(eL_iP_mIP[i][2]+eL_iP_mIP[i+1][2]+eL_iP_mIP[i+2][2]+eL_iP_mIP[i+3][2])/4
    if tmp_avg > avg:
        avg = tmp_avg
    if i+4 <= len(elArray)/4:
        i += 4
    else:
        break

有更多的Pythonic方式吗?或者我可以在哪里使用numpy更有效?

1 个答案:

答案 0 :(得分:1)

始终有4个连续元素标签的解决方案

a[:, -1].reshape(len(a)//4, 4).mean(axis=1).max()

实施例

a = np.array ([[1.0, 1.0, 3.6678965], 
              [1.0, 2.0, -3.6678965],
              [1.0, 3.0, 5.6678965],
              [1.0, 2.0, -3.6678965],
              [2.0, 1.0, 13.6678965], 
              [2.0, 2.0, -3.6678965],
              [2.0, 3.0, 15.6678965],
              [2.0, 2.0, -3.6678965],
              [3.0, 1.0, 100], 
              [3.0, 2.0, 100],
              [3.0, 3.0, 100],
              [3.0, 2.0, 100]])

>>> a[:, -1].reshape(len(a)//4, 4).mean(axis=1).max()
100.0

无序元素标签的解决方案

您可以使用pandas并按第一列分组:

import pandas as pd

df = pd.DataFrame(a)
df.groupby(0)[2].mean().max()

实施例

import pandas as pd
import numpy as np


df = pd.DataFrame(a)

>>> df.groupby(0)[2].mean().max())
100.0