【问题标题】:Find indices for max values subarrays and applying it on that subarray查找最大值子数组的索引并将其应用于该子数组
【发布时间】:2021-04-30 18:28:41
【问题描述】:

我有一个文件 f,其中包含 N(未知)events。每个事件都携带一个(每个事件未知且不同,称为 i、j 等)重构的tracks 数量。然后,每个轨道都具有能量E 和可能性lik 等属性。所以,

>>> print(f.events.tracks.lik) 
[[lik1, lik2, ..., likX], [lik1, lik2, ..., likj], ..., [lik1, lik2, ..., likz]]

打印一个包含 N 个子数组(每个 event 1 个)的数组,每个子数组都显示 lik 及其所有 tracks

目标:致电f.events.tracks[:, Inds].E 以获取最大可能性轨道的能量。

最小代码示例

>>>import numpy as np
>>>lik = np.random.randint(low=0, high=100, size=50).reshape(5, 10)
>>>print(lik)
[[ 3 49 27  3 80 59 96 99 84 34]
 [88 62 61 83 90  9 62 30 92 80]
 [ 5 21 69 40  2 40 13 63 42 46]
 [ 0 55 71 67 63 49 29  7 21  7]
 [40  7 68 46 95 34 74 88 79 15]]
>>>energy = np.random.randint(low=100, high=2000, size=50).reshape(5, 10)
>>>print(energy)
[[1324 1812  917  553  185  743  358  877 1041  905]
[1407  663  359  383  339 1403 1511 1964 1797 1096]
[ 315 1431  565  786  544 1370  919 1617 1442  925]
[1710  698  246 1631 1374 1844  595  465  908  953]
[ 305  384  668  952  458  793  303  153  661  791]]
>>> Inds = np.argmax(lik, axis=1)
>>> print(Inds)
[2 1 8 6 7]

问题:

>>> # call energy[Inds] to get
# [917, 663, 1442, 1844, 153]

获取这些能量的正确方法是什么?

【问题讨论】:

  • 这个问题对我来说有点不清楚。你能添加一个简单/最小的 Python 示例吗? (主要是为了澄清数组类型和问题本身)
  • @JérômeRichard 我添加了一个带有一些随机数的最小示例。如果您能看一看,将不胜感激。
  • 太棒了。但是,我无法使用您的输入重现输出 [2 1 8 6 7]。我得到了[7 8 2 2 4]。你能检查一下这个例子吗? (包括最终的预期值)。我想这只是因为您在调用 np.argmax(lik, axis=1) 之前生成了不同的值。
  • @JérômeRichard 这是由randint 引起的,我的错。您对上面的数字是正确的

标签: python numpy slice argmax


【解决方案1】:

您可以使用包含[0,1,2,...](使用np.arange 生成)的临时数组的二维索引,为每一行选择由Inds 索引的值。

这是一个例子:

energy[np.arange(len(Inds)), Inds]

【讨论】:

  • 这行得通!如果没有其他答案,我会接受你的。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多