【问题标题】:How to check for the existence of a row in an array, create it if it doesn't exist, or modify it if it does exist in python如何检查数组中的一行是否存在,如果不存在则创建它,或者如果它在python中存在则修改它
【发布时间】: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


【解决方案1】:

我找到了this 问答。所以我把我的“年龄”(类型)作为字典中的条目(如果类型不存在,则添加)循环遍历所有条目,从而生成每种类型的值列表:

data = {1: [0.9, 0.95, 0.85, 0.92,], 2: [1.8, 1.7, 1.9,1.83], ...]

然后我可以遍历数据并平均每个列表。它似乎工作得非常有效(在中等大的数据集上不会减慢速度)。也许 pandas 会更好,但现在,我会使用它。

【讨论】:

    猜你喜欢
    • 2011-09-15
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2011-05-16
    • 2017-11-22
    相关资源
    最近更新 更多