numpy/python中的三角转换,速度快,不会占用所有内存

bmvo0sr5  于 2023-05-07  发布在  Python
关注(0)|答案(1)|浏览(127)

我有数据如下

[[1,2,3],
 [4,5,6],
 [7,8,9]]

我想用一个最大行长度来三角化它。因此对于无限大行长度,它将是

[[1],
 [1,2],
 [1,2,3],
 [1,2,3,4],
 [1,2,3,4,5],
 [1,2,3,4,5,6],
 ...
 [1,2,3,4,5,6,7,8,9]]

如果最大行长度为4

[[1],
 [1,2],
 [1,2,3],
 [1,2,3,4],
 [2,3,4,5],
 [3,4,5,6],
 ...
 [6,7,8,9]]

我是罚款与零填充以及使上述可能是

[[1,0,0,0],
 [1,2,0,0],
 [1,2,3,0],
 [1,2,3,4],
 [2,3,4,5],
 [3,4,5,6],
 ...
 [6,7,8,9]]

我考虑过将整个最后一行串联起来,重复这一行,然后应用三角形遮罩。然而,对于我的数据集,我可能会耗尽内存,所以我合并了最大行长度。
有没有一种高效的numpy方法来计算这个转换,而不会占用我的内存?我也愿意使用其他图书馆。也许使用一个数据库或文件存储,我可以在其中部分加载数据可能会有所帮助。对于上下文,这些数据将进入一个线性层(用于投影),然后是一个转换器,所以也许已经有处理这个问题的方法了,但是,我的google foo不够强大。
谢谢大家!

z31licg0

z31licg01#

如果你对左填充没问题,这正是sliding_window_view正在做的:

from numpy.lib.stride_tricks import sliding_window_view as swv

a = np.array([[1,2,3],
              [4,5,6],
              [7,8,9]])

n = 4

swv(np.pad(a.ravel(), (n-1, 0), constant_values=0), 4)

由于返回数组的视图,因此这应该是内存有效的。
输出:

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

相关问题