【问题标题】:How to subset a multidimensional numpy array with steps?如何使用步骤对多维 numpy 数组进行子集化?
【发布时间】:2021-03-14 21:42:20
【问题描述】:

我有一个多维数组是:

d.shape = (744, 1, 288, 315)

第一个维度是小时——所以我想对这个数组进行子集化,这样我就只能得到白天的小时数,所以从 10-17 小时到每次 24 小时的时间段。

我一直在通过创建一个列表进行子集化:

start = 10
end = 17
d_daily = np.array([d[i*24+start:i*24+end] for i in range(31)])

但它很慢。

我觉得应该有一个快速的方法来做一个子集,比如:

d[start:(len(d)-(24-end)):24] # basically, take these 7 steps over and over until the end of the array

但是,这给了我一个 (31, 1, 288, 315) 的数组,而不是我期望的 (217,1,288,315) 输出。

保持数据的顺序也很重要...

我知道这很简单,但非常感谢您的帮助!

谢谢

【问题讨论】:

    标签: python arrays numpy indexing slice


    【解决方案1】:

    这个怎么样,使用模算术:

    import numpy as np
    
    arr = np.zeros((744, 1, 288, 315))
    
    start = 10
    end = 17
    
    idx = np.arange(744) % 24
    bool_arr = np.logical_and(idx >= 10, idx < 17)
    
    d_daily = arr[bool_arr, :, :, :]
    

    我以零数组为例,这将包括从 [10, 17) 开始的小时数(即不包括 17)。

    【讨论】:

    • 谢谢!这确实有效,但是它遇到了我之前遇到的同样问题,因为它需要的时间比必要的多。下面的答案,加上额外的冒号,正是我想要的。
    • 另一个答案只是为您提供第一维中从 310 到 526 的所有元素。即从第 12.91 天到第 21.95 天。我知道你是每天 10 点到 17 点之后的工作?
    【解决方案2】:

    看起来很简单,你可以试试这个吗?

    d[10*31:17*31,:,:,:]
    

    【讨论】:

    • 谢谢!这些冒号正是使公式起作用所需要的!
    • 不客气!坦率地说,您也不需要这些冒号。自己尝试一次。为了便于阅读,我在此处添加了它们。
    • 我不明白这个答案。这不就是把310的元素取到527吗?
    • 从 310 到 527 的轴 = 0 以及沿其他轴的所有其余元素都符合轴 = 0 切片
    猜你喜欢
    • 2015-09-04
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多