Python中的Numpy数组

uemypmqf  于 11个月前  发布在  Python
关注(0)|答案(2)|浏览(158)

我有一个多维numpy数组,其中的一个维度是以年为单位的年龄。我想把它转换成5年的增量。
所以我有一个数组(10,2),其中第一维代表年龄,第二维代表性别,我想计算每5年的平均值,分别是两种性别。

import numpy as np
arr = np.array([[0,1], [2,3], [3,4], [4,5], [5,6], [7,8], [8,9], [9,10], [10,11], [11,12]])

arr.shape

mean_1st_5_yrs_female = np.mean([0,2,3,4,5])
mean_1st_5_yrs_male = np.mean([1,3,4,5,6])
mean_2nd_5_yrs_female = np.mean([7,8,9,10,11])
mean_2nd_5_yrs_male = np.mean([8,9,10,11,12])

arr = np.array([[mean_1st_5_yrs_female, mean_1st_5_yrs_male],[mean_2nd_5_yrs_female, mean_2nd_5_yrs_male]])
arr

字符串
在numpy中我如何自动执行此操作?
谢谢

8nuwlpux

8nuwlpux1#

假设你的第一个(外部)维度是5的适当倍数,你可以做以下事情:

arr.reshape(-1, 5, 2).mean(axis=1)

个字符
-1填充了剩余的维度,在这个特定的例子中,基本上是通过计算10 // 5来填充的。然后,重新整形的数组具有适当的维度:一个用于周期(5年),一个用于性别(2),一个用于周期数的维度(在这个例子中是2;上面的-1)。然后它只是在正确的轴上取平均值的问题:因为这是一个单一时期的平均值,分别为两种性别,这是第二个指数。
如果你不习惯整形,请注意:你不能在原始维度上整形,也就是说,(-1, 2, 5)的形状不起作用(好吧,从技术上讲,它会起作用,但你会发现,如果你然后,例如,沿任何轴沿着平均,你不会得到你想要的,因为原始数据结构中的任何东西现在都丢失了)。

vcudknz3

vcudknz32#

对于Pandas变体(在某些时候,当使用显式命名的列时,例如您在这里看到的,可能更好地使用):

df = pd.DataFrame(arr, columns=['age', 'sex'])
averages = df.groupby(df.index//5).mean()
averages

个字符
如果你想把它放回NumPy:

averages.to_numpy()
array([[ 2.8,  3.8],
       [ 9. , 10. ]])

的字符串
Pandas的优点是它不关心行数是5的整数倍。它会计算平均值,对于最后剩下的行,它仍然会计算平均值,只是行数较少(所以它可能会有一点偏差)。
最后,如果你想要一个滚动平均值:

df.rolling(window=5).mean()


前几个结果将是NaN,因为没有足够的输入,但这对于滚动平均值来说是正常的。更多示例请参见https://pandas.pydata.org/pandas-docs/stable/user_guide/window.html

相关问题