好的,我确信有一种非常简单的方法可以做到这一点,但我在python中生锈了,我无法用pythonic的方式来做到这一点。
我有一个列表,代表当天的小时数:
import numpy as np
hourOfDay = np.mod(range(0, 100), 24)
然后我想创建一个新值列表0.4
,当小时介于7
和22
之间,而0.2
则为{/ 1}。
有几个相关的帖子here和here,但它们并不是我想要的(它们最终会有一个较短的列表,我想要相同长度的列表)。
假设我需要使用列表理解,我试过这个:
newList = [0.4 for hour in hourOfDay if hour <= 7 or hour >= 22 else 0.2]
答案 0 :(得分:1)
你的列表理解略有偏差。此外,如果您希望0.4
小时在7
和22
之间,则需要7<= hour <= 22
:
import numpy as np
hourOfDay = np.mod(range(0, 100), 24)
newList = [0.4 if 7 <= i <= 22 else 0.2 for i in hourOfDay]
>>> newList
[0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.2]
答案 1 :(得分:1)
您可以使用掩码,但请注意,为了拒绝类型转换,您应该创建第一个数据类型为float的数组。
In [15]: hourOfDay = np.mod(range(0, 100), 24, dtype=np.float)
In [16]: mask = np.logical_or(hourOfDay <= 7, hourOfDay >= 22)
In [17]: hourOfDay[mask] = 0.4
In [19]: hourOfDay[~mask] = 0.2
In [20]: hourOfDay
Out[20]:
array([ 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 0.2, 0.2,
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2,
0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2,
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2,
0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4,
0.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2,
0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4,
0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2,
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4,
0.4])
答案 2 :(得分:1)
另一种方法是将map()
用作:
map(lambda x: 0.4 if 7 <= x <= 22 else 0.2, hourOfDay)