我一直在寻找好几个小时,无法找到一个好的解决方案。我需要一个快速的方法,用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更有效?
答案 0 :(得分:1)
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