我有一个包含数百万小时x y点的numpy数组,数组的“列”为x,y,小时和星期几(所有整数)。以下是数组的示例:
if(isset($p[$tag])){
$this->_mergeCSS($p[$tag], $t);
}
我创建了一个零网格,我可以为数组中的所有值递增:
array([[1, 2, 0, 0],
[3, 5, 0, 0],
[6, 3, 1, 0],
[6, 2, 3, 0],
[4, 3, 3, 1]])
但是我需要能够在每周的每个小时(即0小时太阳,小时1小时太阳等)执行此操作。
如何按小时和星期几对数组进行子集化?
我尝试在此处修改答案:Make subset of array, based on values of two other arrays in Python,Subsetting data in Python,但尚未成功。任何帮助将不胜感激!!
答案 0 :(得分:0)
据推测,对于x
和y
对,您想要累计24次7或168组累积计数。假设您的数据位于N
x 4阵列gdat
中。首先,制作工作时间索引:
whr = 24*gdat[:,2] + gdat[:,3]
您现在可以选择一周中每小时的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
返回xy
中值的唯一值和计数。
xyval, xycnt = np.unique(xy, return_counts=True)
然后,您使用按位运算符x
和y
从xyval
检索xyval >> 3
和xyval & 7
值对。
在一周内每小时重复一次。如果N
很大,则存储将成为一个问题,您可能希望在每次迭代时重复使用gdat0
。
编辑:您发布的短数据样本是按时间顺序排列的。如果您的所有数据都是按时间顺序排列的,那么您就不需要选择&#34;选择&#34;每小时一次。您只需要在whr
中找到每个新值的索引。 unique(whr, return_index=True)
也可以找到适合你的那些!