gpt4 book ai didi

python - 以任意倍数删除数组中的项目

转载 作者:行者123 更新时间:2023-11-28 22:26:31 38 4
gpt4 key购买 nike

我有一个数组,它是一个时间列表(它是 10 年的天数),我想删除这个列表中的某个选择,然后根据剩余的天数进行计算。这是针对天体物理模拟的,我正在尝试选择“观察”另一个数据集的某些模式。

我的数组是:

t = [0,1,2,3,...,3650]

出于我的目的,我想保留每年的前 180 天并删除其余的,留下如下内容:

t_new = [1,2,...,178,179,365,366,...]

我是通过以下方式实现的:

a = 180
b = 365 - a

t_new = [x for i, x in enumerate(t) if i%(a+b) < a]

将 a 和 b 作为变量让我能够在每年保留不同数量的数据。

现在我要做的是保留每 30 个剩余数据中的前 10 个。这将模拟只能在每个月的前 10 天和每年的前 6 个月进行观察。

我试过:

c = 10
d = 30-c

t_new2 = [x for i, x in enumerate(t_new) if i%(c+d) < c]

这应该导致:

t_new2 = [0,1,2,3,4,5,6,7,8,9,30,31,...,178,179,365,366,...]

这是我们删除每 30 天(每月)的最后 20 天和 365 天(每年)的最后 185 天后剩余的天数。

但是我得到了错误:

ValueError: too many values to unpack

是否有更好的方法来执行此逻辑,也许将其组合成一行?

谢谢!

后续问题:

目前的解决方案是,

t_new = [365*year+day for year in range(10) for day in range(180) if day%30 < 10]

它根据每个索引的值编辑原始数组。我想在第二个数组中只保留完全相同的索引,其值实际上是随机的,有没有办法将上面的转换为索引操作?

最佳答案

Note: Note that you oversimplify the calendar here. Leap years are ignored here.

您可以按如下方式执行此操作:

[day for year in range(10) for day in range(365*year,365*year+180)]

代码的工作原理如下:首先我们遍历 year:范围从 0(包括)到 10(不包括),所以 0、1、2、3、4、5、 6、7、8 和 9。

接下来,我们用 day365*year(“虚拟年”开始的那一天)到 365*year+180 迭代每一年(我们的 180 天结束的那一天)。

对于每一天,我们都会将其添加到列表中。

这也比在列表理解中使用 if 过滤器语句更有效:这里只生成“有效”天。过滤器当然可以获得相同的功能,但您将首先生成一组(可能很大)值,您稍后必须撤回。

Now what I want to do is keep the first 10 of every 30 of the remaining data.

我们可以通过在此处添加一个额外的过滤器来做到这一点:

[365*year+day for year in range(10) for day in range(180) if day%30 < 10]

这将生成:

>>> [365*year+day for year in range(2) for day in range(180) if day%30 < 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524]

(我只生成了前两年的列表)

编辑:如果您想要上述索引的数组索引,那么您可以简单地使用:

[a[365*year+day] for year in range(10) for day in range(180) if day%30 < 10]

a 是您原始的值列表。

关于python - 以任意倍数删除数组中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44719566/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com