- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个相当专业的查询,我想用 C# 解决。
我有一个类:
class TimeValues
{
DateTime When;
ImmutableArray<float> Values;
}
这表示特定时间多个传感器的报告。我在 ImmutableArray<TimeValues> SomeArray
中使用,代表一系列报告,通常精确到秒。
我要解决的问题是如何以 30 秒为间隔进行分组,并分别对每个传感器的报告进行平均。
例如,如果我有两个报告:
s1 s2 s3
1:20 10 20 30
1:21 30 50 70
并且我们假设 t1 和 t2 彼此相差在 30 秒内,我希望该操作导致:
s1 s2 s3
1:00 avg(10,30) avg(20,50) avg(30,70)
我从以下内容开始:
SomeArray.GroupBy(k => k.When.Second >= 30
? k.When.AddSeconds(-k.When.Second + 30)
: k.When.AddSeconds(-k.When.Second), k => k.Values)
.Select(group => new TimeValues(group.Key, ...))
这是我不太明白的最后一行。必须强调的一点是,必须保持被平均的值的顺序,因为它必须与传感器报告相对应。这是我第一次在 LINQ 中使用 group by,而且可能是比较复杂的一次。
最佳答案
可以说,您的问题与 Average int Array elements with a GroupBy 重复.但是,我对具体答案并不感到兴奋,即它多次迭代组结果,一次针对值数组中的每个索引。恕我直言,最好对组进行一次迭代,将重复的迭代放在值数组本身上。你的问题比另一个更好,所以我在这里给出一个答案。 :)
首先,我不明白你的分组功能。如果你想要 30 秒的间隔,在我看来,将秒数除以 30 应该会给你一个很好的分组键。要完成基本相同的任务,您似乎会遇到很多麻烦。
其次,我不想用 ImmutableArray<T>
安装包那个类与问题没有任何关系,所以我的答案只是使用一个普通的旧数组。
三、我不服this answer甚至做你想做的事。一个from Meleagre看起来不错,但我会采取不同的方法,如下所示:
var result = from g in (from d in data
group d by (int)(d.When.TotalSeconds / 30))
let c = g.Count()
select new TimeValues(TimeSpan.FromSeconds(g.Key * 30),
g.Aggregate(new float[g.First().Values.Length],
(a, tv) =>
{
for (int i = 0; i < a.Length; i++)
{
a[i] += tv.Values[i];
}
return a;
},
a =>
{
for (int i = 0; i < a.Length; i++)
{
a[i] /= c;
}
return a;
}));
上面使用了 LINQ Aggregate()
方法将每个值累加到其各自的索引中,然后在最后计算平均值。这些函数分别使用了两种不同的 lambda 匿名方法。恕我直言,如果将代码分解为实际的命名方法,代码实际上会更具可读性。哪种方式都可以。
我更喜欢这种方法,因为它最大限度地减少了对象分配(无需构建列表然后在最后转换为数组)并且恕我直言,更清楚地表达了代码背后的意图。
我相信您可以调整基于数组的示例以使用 ImmutableArray<T>
. :)
关于c# - 在 GroupBy() 之后按 LINQ 中的数组索引平均元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38650715/
给定输入: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 将数字按奇数或偶数分组,然后按小于或大于 5 分组。 预期输出: [[1, 3, 5], [2, 4], [6, 8, 10
编辑: @coldspeed、@wen-ben、@ALollz 指出了我在字符串 np.nan 中犯的新手错误。答案很好,所以我不删除这个问题来保留那些答案。 原文: 我读过这个问题/答案 What'
我试图概括我提出的问题 here . mlb 数据框看起来像 Player Position Salary Year 0 Mike Wit
我认为我不需要共享整个数据框,但基本上,这是有问题的代码行(当然,已经导入了 pandas) divstack = df[df['Competitor']=='Emma Slabach'].group
我面临下一个问题:我有组(按 ID),对于所有这些组,我需要应用以下代码:如果组内位置之间的距离在 3 米以内,则需要将它们添加在一起,因此将创建一个新组(代码如何创建我在下面显示的组)。现在,我想要
我有以下数据: ,dateTime,magnitude,occurrence,dateTime_s 1,2017-11-20 08:00:09.052260,12861,1,2017-11-20 08
我按感兴趣的列对 df 进行分组: grouped = df.groupby('columnA') 现在我只想保留至少有 5 名成员的组: grouped.filter(lambda x: len(x
数据是一个时间序列,许多成员 ID 与许多类别相关联: data_df = pd.DataFrame({'Date': ['2018-09-14 00:00:22',
选择 u.UM_TOKEN_NO 、u.UM_FULLNAME、u.SECTOR、u.department_name、t.TS_PROJECT_CODE、sum(t.TS_TOTAL_HRS) 来自
我有这两个表: +---------------+-------------+---------------------+----------+---------+ | items_ordered |
我正在使用 groupby 和 sum 快速汇总两个数据集 一个包含: sequence shares 1 100 2 200 3 50 1 2
这个问题在这里已经有了答案: list around groupby results in empty groups (3 个答案) itertools groupby object not out
我有一组行,我想按标识符的值进行分组 - 存在于每一行中 - 然后对将作为结果的组进行进一步的隔离处理。 我的数据框是这样的: In [50]: df Out[50]: groupkey b
假设您要在全局范围内销售产品,并且希望在某个主要城市的某个地方设立销售办事处。您的决定将完全基于销售数字。 这将是您的(简化的)销售数据: df={ 'Product':'Chair', 'Count
我有一个将数据分组两次的查询: var query = (from a in Context.SetA() from b in Context.SetB().Where(x => x.aId == a
我有一个这种格式的数据框: value identifier 2007-01-01 0.087085 55 2007-01-01 0.703249
这个问题在这里已经有了答案: python groupby behaviour? (3 个答案) 关闭 4 年前。 我有一个这样的列表 [u'201003', u'200403', u'200803
在 Python 中,我可以使用 itertools.groupby 将具有相同键的连续元素分组。 : >>> items = [(1, 2), (1, 5), (1, 3), (2, 9), (3,
无法翻译以下 GroupBy 查询并将引发错误:不支持客户端 GroupBy IEnumerable ids = new List { 1, 2, 3 }; var q = db.Comments.W
考虑一个 Spark DataFrame,其中只有很少的列。目标是对其执行 groupBy 操作,而不将其转换为 Pandas DataFrame。等效的 Pandas groupBy 代码如下所示:
我是一名优秀的程序员,十分优秀!