【问题标题】:How to reshape numpy array keeping each nth element如何重塑numpy数组保持每个第n个元素
【发布时间】:2018-05-14 15:34:15
【问题描述】:

我有一个 numpy 形状数组,例如 (1000, 80),我想将其转换为 (100, 40, 2)。您可以将其视为有 1000 个观察值,其中前 40 列指的是 40 天内的特定特征,接下来的 40 列指的是同一 40 天内的第二个特征。

所以,我希望第 2 个维度是 40 天,而第 3 个维度应该是这两个特征每天的值。

这是我尝试过的一个简单示例:

import numpy as np

data = [[11, 22, 33, 44],
        [55, 66, 77 ,88],
        [99, 100, 101, 102]]
data = np.array(data)

# This works but I have to manually do it for every day
np.c_[data[:, ::2], data[:, 1::2]].reshape((3, 2, 2))

# This does not work
np.c_[data[:, i::2] for i in range(2)].reshape((3, 2, 2))

期望的输出:

array([[[ 11,  33],
    [ 22,  44]],
    [[ 55,  77],
     [ 66,  88]],
    [[ 99, 101],
     [100, 102]]])

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    你可以先reshape再转置二三轴:

    data.reshape(-1, 2, data.shape[1] / 2).transpose(0,2,1)
    #array([[[ 11,  33],
    #        [ 22,  44]],
    
    #       [[ 55,  77],
    #        [ 66,  88]],
    
    #       [[ 99, 101],
    #        [100, 102]]])
    

    swapaxes:

    data.reshape(-1, 2, data.shape[1] / 2).swapaxes(1,2)
    #array([[[ 11,  33],
    #        [ 22,  44]],
    
    #       [[ 55,  77],
    #        [ 66,  88]],
    
    #       [[ 99, 101],
    #        [100, 102]]])
    

    或者正如@wwii 评论的那样,reshapecolumn-major 顺序:

    data.reshape(-1, data.shape[1] / 2, 2, order='F')
    

    【讨论】:

    • 除非我使用 data.shape[1] // 2 - ??
    • 是否必须交换轴,因为 reshape 默认为 row-major 顺序?您没有使用order='F' 有什么原因吗?我没有看到人们经常在 SO 上使用它。
    • @wwii 是的,你是对的 order='F' 也应该在这里工作,是一个不错的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2014-11-24
    • 2020-07-21
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多