【问题标题】:Numpy - index groups of rows into higher dimensional arrayNumpy - 将行组索引到高维数组中
【发布时间】:2021-06-28 19:43:06
【问题描述】:

我有一个 2D 数组,我想将其转换为 3D 数组,其中新数组的每一行都包含原始 2D 数组的多行。

此代码复制了功能(输出数组的每一行包含 3 行输入数组)但我只是想知道正确的方法是什么,我认为更正确的索引方法会更快大型数据集。

input = np.arange(100) + np.arange(100)[:,None]
output = np.apply_along_axis(lambda x: input[x[0]:x[0]+3], 1, np.arange(100-2)[:,None])

input 数组如下所示:

array([[  0,   1,   2, ...,  97,  98,  99],
       [  1,   2,   3, ...,  98,  99, 100],
       [  2,   3,   4, ...,  99, 100, 101],
       ...,
       [ 97,  98,  99, ..., 194, 195, 196],
       [ 98,  99, 100, ..., 195, 196, 197],
       [ 99, 100, 101, ..., 196, 197, 198]])

output 数组看起来像这样:

array([[[  0,   1,   2, ...,  97,  98,  99],
        [  1,   2,   3, ...,  98,  99, 100],
        [  2,   3,   4, ...,  99, 100, 101]],

       [[  1,   2,   3, ...,  98,  99, 100],
        [  2,   3,   4, ...,  99, 100, 101],
        [  3,   4,   5, ..., 100, 101, 102]],

       [[  2,   3,   4, ...,  99, 100, 101],
        [  3,   4,   5, ..., 100, 101, 102],
        [  4,   5,   6, ..., 101, 102, 103]],

       ...,

       [[ 95,  96,  97, ..., 192, 193, 194],
        [ 96,  97,  98, ..., 193, 194, 195],
        [ 97,  98,  99, ..., 194, 195, 196]],

       [[ 96,  97,  98, ..., 193, 194, 195],
        [ 97,  98,  99, ..., 194, 195, 196],
        [ 98,  99, 100, ..., 195, 196, 197]],

       [[ 97,  98,  99, ..., 194, 195, 196],
        [ 98,  99, 100, ..., 195, 196, 197],
        [ 99, 100, 101, ..., 196, 197, 198]]])

【问题讨论】:

  • inputnp.arange(100) + np.arange(100)[:, None],对吧?输出形状为(98, 3, 100)?
  • 哇,这样更干净(我的 numpy 生锈了,所以我更新了问题)。但是,是的,你是对的。

标签: python numpy indexing


【解决方案1】:

首先,您可以初始化input,就像您使用简单的广播一样:

ainput = np.arange(100) + np.arange(100)[:, None]

您永远不必转置对称数组,或命名影响内置函数的变量。

您可以使用np.lib.stride_tricks.as_strided 获得不带循环的输出(这是np.apply_along_axis 在后台所做的):

n = 3
aoutput = np.lib.stride_tricks.as_strided(ainput, shape=(ainput.shape[0] - n + 1, n, ainput.shape[1]), strides=(ainput.strides[0], *ainput.strides))

这基本上是将ainput 视为所需形状的数组,新维度在原始数组中的步幅为一行。这意味着不同层的内存重叠,如果你决定写入这个数组,你可能会同时看到三个地方的变化。

从 numpy 版本 1.20 开始,有一个瘦包装器可以做同样的事情:np.lib.stride_tricks.sliding_window_view。它允许您根据窗口大小和轴工作,而无需手动计算形状和步幅:

aoutput = np.lib.stride_tricks.sliding_window_view(ainput, (3, 100), axis=(0, 1))

【讨论】:

  • 所以我不想跳行。 aoutput 第二行有ainput 的第 3-5 行,但我想要第二行的第 1-4 行。我不确定上面的strides 的形状是什么。
  • @SuperCodeBrah。更新。步幅是给定维度中元素之间的字节数
  • 美丽。积分奖励
  • @SuperCodeBrah。我很喜欢积分。我更新了一个更易于使用的替代方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2016-07-27
  • 2011-07-07
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多