仅使用步幅无法完成您的任务,但 NumPy 确实支持
一种可以完成这项工作的数组。迈着大步和masked_array
您可以为您的数据创建所需的视图。然而,并非所有
NumPy 函数支持以下操作masked_array
,所以是
可能 scikit-learn 也不能很好地处理这些。
让我们首先重新审视一下我们在这里尝试做的事情。
考虑示例的输入数据。基本上数据是
只是内存中的一维数组,如果我们考虑一下就更简单
与此迈出的步伐。该数组看起来只是二维的,因为我们
已经定义了它的形状。使用步幅,可以定义形状
像这样:
from numpy.lib.stride_tricks import as_strided
base = np.arange(9)
isize = base.itemsize
A = as_strided(base, shape=(3, 3), strides=(3 * isize, isize))
现在的目标是迈出这样的步伐base
它命令
像最后数组中的数字,B
。换句话说,我们要求
整数a
and b
这样
>>> as_strided(base, shape=(4, 4), strides=(a, b))
array([[0, 1, 3, 4],
[1, 2, 4, 5],
[3, 4, 6, 7],
[4, 5, 7, 8]])
但这显然是不可能的。我们可以实现的最接近的视图
这是一个滚动窗口base
:
>>> C = as_strided(base, shape=(5, 5), strides=(isize, isize))
>>> C
array([[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8]])
但这里的区别在于我们有额外的列和行,这
我们想摆脱。因此,实际上我们要求
滚动窗口不连续并且也会按常规跳跃
间隔。在这个例子中,我们希望每三个项目都有一个
从窗口中排除并跳过两行后的一项。
我们可以将其描述为masked_array
:
>>> mask = np.zeros((5, 5), dtype=bool)
>>> mask[2, :] = True
>>> mask[:, 2] = True
>>> D = np.ma.masked_array(C, mask=mask)
这个数组正是我们想要的数据,而且它只是一个
查看原始数据。我们可以确认数据是相等的
>>> D.data[~D.mask].reshape(4, 4)
array([[0, 1, 3, 4],
[1, 2, 4, 5],
[3, 4, 6, 7],
[4, 5, 7, 8]])
但正如我一开始所说的,scikit-learn 很可能
不理解屏蔽数组。如果它只是将其转换为
数组,数据会出错:
>>> np.array(D)
array([[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8]])