按小时和星期几对 numpy 数组进行子集化

Subsetting numpy array by hour and day of week

我有一个包含数百万个每小时 x y 点的 numpy 数组,数组的 "columns" 是 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 Python, Subsetting data in Python,但没有成功。任何帮助将不胜感激!!

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

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

您现在可以 select 一周中每个小时的 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 来 return 唯一值并计数 xy 中的值。

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

然后您使用按位运算符 xyval >> 3xyval & 7.

xyval 检索 xy 值对

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

编辑:您发布的短数据样本是按时间顺序排列的。如果您的所有数据都是按时间顺序排列的,则不需要每小时 "select"。您只需要为 whr 中的每个新值找到索引即可。 unique(whr, return_index=True) 也会为您找到那些!