按小时和星期几对 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,但没有成功。任何帮助将不胜感激!!
大概您希望得到 x
和 y
对的 24 乘以 7 或 168 组累积计数。假设您的数据位于 N
x 4 数组 gdat
中。首先,制作周时索引:
whr = 24*gdat[:,2] + gdat[:,3]
您现在可以 select 一周中每个小时的 gdat
行。例如,对于周日的零点:
gdat0 = gdat[whr == 0]
用 gdat0
做任何你需要的总结,然后继续下一个小时。
请注意,unique
可能是计算 x, y
对出现次数的更快方法。您可以玩同样的游戏,为 x
和 y
创建复合索引,但您必须知道它们是如何界定的。假设 x
从 0 到 120,y
从 0 到 5,您可以使用位字段创建复合索引:
xy = (gdat0[:,0] << 3) & (gdat0[:,1])
显然,如果 y
的范围较大,则需要移动超过 3 位,并且可能需要偏移 x
和 y
以避免出现负值。
然后,使用 unique
来 return 唯一值并计数 xy
中的值。
xyval, xycnt = np.unique(xy, return_counts=True)
然后您使用按位运算符 xyval >> 3
和 xyval & 7
.
从 xyval
检索 x
和 y
值对
一周中每小时重复一次。由于如果 N
很大,存储将成为一个问题,您可能希望在每次迭代中重新使用 gdat0
。
编辑:您发布的短数据样本是按时间顺序排列的。如果您的所有数据都是按时间顺序排列的,则不需要每小时 "select"。您只需要为 whr
中的每个新值找到索引即可。 unique(whr, return_index=True)
也会为您找到那些!
我有一个包含数百万个每小时 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,但没有成功。任何帮助将不胜感激!!
大概您希望得到 x
和 y
对的 24 乘以 7 或 168 组累积计数。假设您的数据位于 N
x 4 数组 gdat
中。首先,制作周时索引:
whr = 24*gdat[:,2] + gdat[:,3]
您现在可以 select 一周中每个小时的 gdat
行。例如,对于周日的零点:
gdat0 = gdat[whr == 0]
用 gdat0
做任何你需要的总结,然后继续下一个小时。
请注意,unique
可能是计算 x, y
对出现次数的更快方法。您可以玩同样的游戏,为 x
和 y
创建复合索引,但您必须知道它们是如何界定的。假设 x
从 0 到 120,y
从 0 到 5,您可以使用位字段创建复合索引:
xy = (gdat0[:,0] << 3) & (gdat0[:,1])
显然,如果 y
的范围较大,则需要移动超过 3 位,并且可能需要偏移 x
和 y
以避免出现负值。
然后,使用 unique
来 return 唯一值并计数 xy
中的值。
xyval, xycnt = np.unique(xy, return_counts=True)
然后您使用按位运算符 xyval >> 3
和 xyval & 7
.
xyval
检索 x
和 y
值对
一周中每小时重复一次。由于如果 N
很大,存储将成为一个问题,您可能希望在每次迭代中重新使用 gdat0
。
编辑:您发布的短数据样本是按时间顺序排列的。如果您的所有数据都是按时间顺序排列的,则不需要每小时 "select"。您只需要为 whr
中的每个新值找到索引即可。 unique(whr, return_index=True)
也会为您找到那些!