【发布时间】:2020-03-18 20:14:39
【问题描述】:
使用未排序的数组,我试图计算特定类型子集的平均值。也就是说,任何给定的行都有一个类型和一个值,其中类型是某个值的整数(在某个范围内重复)并且该值是浮点数。例如:
import numpy as np
np.data=array([[1,1.3],[2,2.2],[3,3.7],[4,5.1],[1,1.25],[2,2.3],[3,3.4]])
(这个问题的实际应用可能是“找出列表中人的平均收入”;然后我将绘制收入与年龄的关系图)
如何找到类型 1 的所有值的平均值?例如。 (np.data[0,1]+np.data[4,1])/2
我目前正在尝试使用我的类型、累积值和一个计数器将我的平均值编译到一个新数组中(然后最后我将累积值除以计数器以获得平均值)。所以我定义了一个新数组,然后尝试检查是否有当前类型的条目。如果有,则添加到累积值并迭代计数器,如果没有则创建新行。但是如何检查呢?这可能不是正确的结构(如果不是尝试?)并且 np.where 返回一个数组。有很多问题,但我试图保持精简,因为我的数据数组有数百万个条目。
# avg = [type, cumulative val,counter]
# data = [type, value]
for i in xrange(1,len(data)):
try:
# find if there is already cumulative data for type of this data
k = np.where(np.avg==data[i,0]) # this isn't right
# if data is accumulating for this type, add and increment
avg[k[0],1]+=data[i,1]
avg[k[0],2]+=1
except IndexError:
# if there is no data for this type, add new row to array
np.concatenate((avg,data[i]))
编辑: 我找到了this 问答。所以我把我的“年龄”(类型)作为字典中的条目(如果类型不存在,则添加)循环遍历所有条目,从而产生每种类型的值列表:
data = {1: [0.9, 0.95, 0.85, 0.92,], 2: [1.8, 1.7, 1.9,1.83], ...]
然后我可以遍历数据并平均每个列表。它似乎工作得非常有效(在中等大的数据集上没有减速)。也许 pandas 会更好,但现在,我会使用它。
【问题讨论】:
-
你考虑过使用 Pandas 吗?使用
pandas.groupby之类的代码,您可能会得到更简单(并且可能更快)的代码。 -
@hilberts_drinking_problem 或就此而言,仅使用普通的
list会好得多 -
@juanpa.arrivillaga 我的评论是关于 OP 的最终目标:“找出列表中人的平均收入”;然后......绘制收入与年龄的关系。熊猫似乎很合适。
标签: python arrays numpy average