【问题标题】:Subsetting numpy array by hour and day of week按小时和星期几对numpy数组进行子集
【发布时间】:2015-11-20 15:29:38
【问题描述】:

我有一个包含数百万小时 x y 点的 numpy 数组,其中数组的“列”是 x、y、小时和星期几(所有整数)。以下是数组的示例:

array([[1, 2, 0, 0],
       [3, 5, 0, 0],
       [6, 3, 1, 0],
       [6, 2, 3, 0],
       [4, 3, 3, 1]])

我创建了一个零网格,我可以为数组中的所有值递增:

grid = np.zeros((8,8))
for value in range(0,len(xy_new[:,1])):  
    grid[xy_new[value][1],xy_new[value][0]] += 1

但我需要能够在一周中的每一天每小时执行此操作(即太阳在 0 小时,太阳在 1 小时等)。

如何按小时和星期几对数组进行子集化?

我已尝试在此处修改答案:Make subset of array, based on values of two other arrays in PythonSubsetting data in Python,但没有成功。任何帮助将不胜感激!

【问题讨论】:

  • 还有什么问题?
  • 如何按天和小时对数组进行子集化以计算每个点被访问的次数?

标签: python arrays numpy conditional subset


【解决方案1】:

大概您希望得到 24 次 7 或 168 组 xy 对的累积计数。假设您的数据位于 N 乘以 4 的数组 gdat 中。首先,制作周时索引:

whr = 24*gdat[:,2] + gdat[:,3]

您现在可以为一周中的每个小时选择gdat 行。例如,对于周日的零小时:

gdat0 = gdat[whr == 0]

gdat0 做任何你需要的求和,然后继续下一个小时。

请注意,unique 可能是计算 x, y 对出现次数的更快方法。您可以玩为xy 创建复合索引的相同游戏,但您必须知道它们是如何有界的。假设x 的范围是 0 到 120,y 的范围是 0 到 5,你可以使用位域来创建一个复合索引:

xy = (gdat0[:,0] << 3) & (gdat0[:,1])

显然,如果y 的范围更大,则需要移动超过3 位,并且可能需要偏移xy 以避免负值。

然后,使用unique 返回xy 中值的唯一值和计数。

xyval, xycnt = np.unique(xy, return_counts=True)

然后,您使用位运算符 xyval &gt;&gt; 3xyval &amp; 7xyval 检索 xy 值对。

每周重复一次。由于如果N 很大,存储将成为问题,因此您可能希望在每次迭代中重复使用gdat0

编辑:您发布的简短数据样本是按时间顺序排列的。如果您的所有数据都是按时间顺序排列的,则您无需为每个小时“选择”。您只需要在whr 中找到每个新值的索引。 unique(whr, return_index=True) 也会为您找到!

【讨论】:

  • 谢谢!一旦我将 gdat0 = gdat[:, whr == 0] 更改为 gdat0 = gdat[whr == 0],您提供的第一种方法效果很好。你有它的方式产生了一个错误:第 1 维中的索引超出范围
猜你喜欢
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
  • 2016-05-31
  • 2020-06-01
  • 1970-01-01
相关资源
最近更新 更多