【问题标题】:sum values in an array for all values less than current对数组中所有小于当前值的值求和
【发布时间】:2019-08-27 19:49:27
【问题描述】:

寻找一种不循环的方法来获取同一区间内小于当前值但也在定义区间内的所有值。

我有 8760 行数据要排序,并希望有比循环更短的方法。使用一些循环代码,执行需要 5 分钟以上

x=np.array([[250,1,1],[300,.5,1],[100,2,1],[200,.75,1],[150,.25,1],[50,.5,2]])

我正在尝试对第一个元素 (250,300,100,50) 求和,其中第二个元素小于当前值,第三个元素等于当前值的第三个元素。

例子

对于 [250,1,1]

我只想找到300+200+150,因为它们将1 作为第三个元素,而.5.75.25 的第二个元素小于1。这需要对每一行继续

对于第二个元素[300,.5,1],它会找到150 的值,因为这是唯一具有更大索引的元素,1 作为第三个元素并且其值小于.5

编辑:固定最小示例

【问题讨论】:

  • 总和是否应该排除x[:,0] 中的当前值?你的例子对我来说并不完全清楚。我认为它与上面给出的描述不符。一般注意事项:也许这个问题更适合 CodeReview?
  • 它不应包含当前值。

标签: python numpy


【解决方案1】:

可以使用布尔掩码吗?

import numpy as np

x = np.array([[250,1,1],[300,.5,1],[100,2,1],[200,.75,1],[150,.25,1],[50,.5,2]])

mask = (x[:, 1] < x[:, 0]) & (x[:, 2] == np.floor_divide(x[:, 0], 100))
np.sum(x[mask, 0])

【讨论】:

  • 这只是给出250 - 如果我的问题正确,他想要计算每一行的总和
  • 他可以使用np.cumsum 或任何其他反映他想要的精确计算的函数。这只是一个例子,但关键是如果他能够使用掩码,那么他不需要使用循环并且会更快。
  • 当然,我也认为屏蔽可能是一个好方法 - 只是屏蔽会根据每一行而有所不同(不过,如果我的问题正确的话)。所以也许你可以展示一下如何避免循环?
  • 我被困在这里 - newarray=np.where((a[:,2]==1) & (a[:,2]
猜你喜欢
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多