【问题标题】:How to make an array like [[123][234][345]] using numpy? [duplicate]如何使用numpy制作像[[123][234][345]]这样的数组? [复制]
【发布时间】:2016-11-15 05:21:32
【问题描述】:

我有一个类似的数组 [1,3,4,5,6,2,1,,,,]

现在,我想将其更改为 [[1,3,4],[3,4,5],[4,5,6],[5,6,2],,,,]

如何使用 numpy 实现这一点?有什么功能可以这样做吗?而且,使用循环不是一种选择。

【问题讨论】:

  • 这真的是一个数组,还是只是一个列表?还有多大?你打算怎么处理结果?有一个使用stride_tricks 的数组方法,但这是针对“高级用户”的。

标签: python numpy


【解决方案1】:

np.lib.stride_tricks.as_strided 方法会做到这一点。

对于 32 位整数,这里的步幅是 (4,4)。如果您想要更灵活的代码,我在代码中注释了 stride 参数。 shape 参数决定了输出数组的维度。

> import numpy as np
> A = [1,2,3,4,5,6]
> n = 3 # output matrix has 3 columns
> m = len(A) - (n-1) # calculate number of output matrix rows using input matrix length
> # strides_param = np.array(A, dtype=np.int32).strides * 2
> np.lib.stride_tricks.as_strided(A, shape=(m,n), strides=(4,4))
array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [4, 5, 6]])

【讨论】:

  • @beroe 我用输出编辑了答案
  • 您的子列表不重叠。
  • @hpaulj 我修改了代码
【解决方案2】:

使用列表推导而不是库,但为什么要让它变得复杂。 (你认为这是一个循环吗?)

x = [1,3,4,5,6,2,1]
y = [x[n:n+3] for n in range(len(x)-2)]

结果是:

[[1, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 2], [6, 2, 1]]

【讨论】:

    猜你喜欢
    • 2021-04-18
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2011-07-16
    相关资源
    最近更新 更多