【问题标题】:How to slice numpy array such that each slice becomes a new array如何对numpy数组进行切片,使每个切片成为一个新数组
【发布时间】:2017-09-08 12:16:14
【问题描述】:

说有这个数组:

x=np.arange(10).reshape(5,2)
x=array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])

是否可以对数组进行切片,使得除了第一行之外的每一行都将这些行组合成一个新矩阵?

例如:

newMatrixArray[0]=array([[0, 1],
       [2, 3]])

newMatrixArray[1]=array([[0, 1],
       [4, 5]])

newMatrixArray[2]=array([[0, 1],
       [6, 7]])

使用 for 循环很容易做到这一点,但是有没有一种 Python 的方式来做到这一点?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    我们可以形成所有这些行索引,然后简单地索引到x

    因此,一种解决方案是 -

    n = x.shape[0]
    idx = np.c_[np.zeros((n-1,1),dtype=int), np.arange(1,n)]
    out = x[idx]
    

    样本输入、输出-

    In [41]: x
    Out[41]: 
    array([[0, 1],
           [2, 3],
           [4, 5],
           [6, 7],
           [8, 9]])
    
    In [42]: out
    Out[42]: 
    array([[[0, 1],
            [2, 3]],
    
           [[0, 1],
            [4, 5]],
    
           [[0, 1],
            [6, 7]],
    
           [[0, 1],
            [8, 9]]])
    

    还有多种其他方法可以获取这些索引idx。让我们建议几个只是为了好玩。

    一个broadcasting -

    (np.arange(n-1)[:,None] + [0,1])*[0,1]
    

    一个array-initialization -

    idx = np.zeros((n-1,2),dtype=int)
    idx[:,1] = np.arange(1,n)
    

    一个cumsum -

    np.repeat(np.arange(2)[None],n-1,axis=0).cumsum(0)
    

    一个带有列表扩展 -

    np.c_[[[0]]*(n-1), range(1,n)]
    

    此外,为了提高性能,请使用 np.column_stacknp.concatenate 代替 np.c_

    【讨论】:

    • 整洁!用另一个 2D 数组索引一个 2D 数组让我有点想不通。
    • np.r_ 也能做到这一点吗?
    • @Alex 我们正在处理二维索引数组。我们使用np.r_ 形成一维数组。所以,我不确定我们是否/如何在这里使用它。
    • 我的错误,没有阅读文档中的细则。
    【解决方案2】:

    我的方法是列表理解:

    np.array([
        [x[0], x[i]]
        for i in range(1, len(x))
    ])
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多