用匹配的平面重复填充 3D numpy 数组

问题描述 投票:0回答:1

我有两个大尺寸的 3D numpy 数组

(~1.2b elements, e.g. 80k x 500 x 30)
。 这两个数组在二维上具有相同的大小,但在第三个维度上不同,这与时间戳有关。我还有两个数组,其中包含对应于沿大小不同轴的平面的时间戳值。我想拉伸/广播并用在间隙之前本身包含值的最后一个平面填充较短的数组,以便达到与较大数组相同的大小,以便我可以将它们相加。 “间隙”和“最后一个平面”由时间戳数组与数据数组相关的匹配方式决定。

这是说明的逻辑(有黑色字体,对于黑暗模式版本,请参见下文):


编辑1

沿着数组大小不同的轴,时间戳数组中对应的值是日期。但是,这些时间戳的粒度可能会有所不同。例如,与较大数组相关的时间戳可能是一系列连续的日子,而与较短数组相关的时间戳可能是同一时期内的每个星期五,但结束时间短或开始时间晚,即错过前 5 个星期五或与较大数组的开始和结束比较时的最后 10 个星期五。

当存在这样的“差距”时,我希望(从时间上讲)3D 阵列的最后一个可用平面在该间隙上延伸,直到下一个可用平面具有值。

注意,星期五的例子只是一个例子。也可能是较大的数组对应某个时期的每个星期一,而较短的数组是该时期每个月的第一天,但结束时间短或开始时间晚。

另一个重要的注意事项可能是与时间戳相关的 3D 数组的轴具有所有轴的最小尺寸。例如,数组 1 可能是 (80k, 500, 180),而数组 2 可能是 (80k, 500, 50)。因此,遍历该轴然后重复大小为 (80k, 500, 1) 的平面可能会起作用。但我不知道怎么做。


为暗模式用户使用白色字体重复图像:

python numpy numpy-ndarray array-broadcasting
1个回答
0
投票

我认为这在很大程度上取决于时间戳的外观。主要技巧是为第二个数组生成一个索引数组,该数组的长度与第一个数组的可变大小轴相同。为了说明,假设您有数组

A
B
以及类似的东西:

m, k, n, v = 3, 4, 10, 5

A = np.random.randint(10, size=(m, n, k))
B = np.random.randint(10, size=(m, v, k))

A_timestamps = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
B_timestamps = [1, 2, 4, 7, 8]

你想要的 B 的重新索引数组是:

reindex = [0, 1, 1, 2, 2, 2, 3, 4, 4, 4] # <<< Index taken from B
#          0, 1, 2, 3, 4, 5, 6, 7, 8, 9    <<< Corresponding "aligned" index in A

这样你就可以简单地写:

out = A + B[:, reindex, :]

那么创建重新索引数组的最佳方法是什么?我不知道......这是我想出的,假设时间戳是唯一且排序的:

equals = np.equal.outer(A_timestamps, B_timestamps)
filled = np.maximum.accumulate(equals, axis=0)
reindex = len(B_timestamps) - np.argmax(filled[:, ::-1], axis=1) - 1
# array([0, 1, 1, 2, 2, 2, 3, 4, 4, 4], dtype=int64)
© www.soinside.com 2019 - 2024. All rights reserved.