从一维数组的偏移范围有效构造Numpy矩阵

时间:2019-11-18 21:11:32

标签: numpy numpy-ndarray numpy-broadcasting numpy-slicing

假设我有一个一维数据数组。我想(有效地)产生一个矩阵,这样 矩阵的每一行都是数据数组中值的连续范围,并且 相对于上一行,矩阵(在原始数据数组中)偏移了1。

此示例可能会使它更容易理解:

# fake data, for demonstration
data = np.arange(100) 

# some parameters
offset = 4
span = 10
n = 20

# one way to do this, I'm guessing the for loop is not the most efficient
np.stack([data[i+offset:i+offset+span] for i in range(n)])

哪个会产生:

array([[ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13],
       [ 5,  6,  7,  8,  9, 10, 11, 12, 13, 14],
       [ 6,  7,  8,  9, 10, 11, 12, 13, 14, 15],
       [ 7,  8,  9, 10, 11, 12, 13, 14, 15, 16],
       [ 8,  9, 10, 11, 12, 13, 14, 15, 16, 17],
       [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
       [12, 13, 14, 15, 16, 17, 18, 19, 20, 21],
       [13, 14, 15, 16, 17, 18, 19, 20, 21, 22],
       [14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
       [15, 16, 17, 18, 19, 20, 21, 22, 23, 24],
       [16, 17, 18, 19, 20, 21, 22, 23, 24, 25],
       [17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
       [18, 19, 20, 21, 22, 23, 24, 25, 26, 27],
       [19, 20, 21, 22, 23, 24, 25, 26, 27, 28],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
       [22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
       [23, 24, 25, 26, 27, 28, 29, 30, 31, 32]])

我显然已经找到了解决方法,但是我认为必须有一种更有效的numpythonic方法来避免for-loop / stack。我将需要做很多事情(在另一个循环中),并希望最大限度地提高性能。

TIA

0 个答案:

没有答案