我有以下列表:
[50.0, 100.0, 150.0, 5.0, 200.0, 300.0, 10.0, 400.0]
我想使用:
分隔符合并列表中的项目,以创建以下列表:
[50.0, 100.0:150.0:5, 200.0:300.0:10.0, 400.0]
我想在numpy.r_
中使用新列表。我已经将我的列表从字符串转换为浮点数,所以我想保留浮点数,只需在适当的索引之间添加:
分隔符。我遇到问题的问题是,如果我想要浮点数,我无法转换100.0:150.0:5
时间间隔值,并且使用我的浮点值时,我无法添加:
分隔符。谁能指出我正确的方向?
答案 0 :(得分:3)
您不能使用:
分隔的数字,而不用""
包裹它们(即作为字符串)。但是,您可以使用slice
:
s = [50.0, 100.0, 150.0, 5.0, 200.0, 300.0, 10.0, 400.0]
it = iter(s[1:-1])
s[1:-1] = map(slice, *(it,)*3)
print(s)
# [50.0, slice(100.0, 150.0, 5.0), slice(200.0, 300.0, 10.0), 400.0]
现在可以与np.r_
和np.concatenate
一起使用,如下所示:
>>> np.concatenate([np.r_[i] for i in s])
array([ 50., 100., 105., 110., 115., 120., 125., 130., 135.,
140., 145., 200., 210., 220., 230., 240., 250., 260.,
270., 280., 290., 400.])
产生您想要的结果。
答案 1 :(得分:2)
我认为你在谈论:
In [152]: [50.0, 100.0, 150.0, 5.0, 200.0, 300.0, 10.0, 400.0]
Out[152]: [50.0, 100.0, 150.0, 5.0, 200.0, 300.0, 10.0, 400.0]
In [153]: np.r_[50.0, 100.0:150.0:5.0, 200.0:300.0:10.0, 400.0]
Out[153]:
array([ 50., 100., 105., 110., 115., 120., 125., 130., 135.,
140., 145., 200., 210., 220., 230., 240., 250., 260.,
270., 280., 290., 400.])
我在:
编辑器中添加了ipython
。我并没有真正进行字符串操作,例如np.r_['50.0', '100.0:150.0:5.0',...]
。
等效表达式使用slice
:
np.r_[50.0, slice(100.0,150.0,5.0), slice(200.0,300.0,10.0), 400.0]
或者如果列表是ll
:
np.r_[ll[0], slice(*ll[1:4]), slice(*ll[4:7]), ll[7]]
在索引上下文[]
中,a:b:c
表达式将转换为切片对象slice(a,b,c)
。 r_
然后将其转换为arange(a,b,c)
,然后将其连接起来。
r_
表达式实际上是:
np.concatenate([ [ll[0]], np.arange(*ll[1:4]), np.arange(*ll[4:7]), [ll[7]] ])
将中间值分组为3并将它们放入切片中的一种简单方法是:
In [166]: [slice(*ii) for ii in np.array(ll[1:-1]).reshape(-1,3)]
Out[166]: [slice(100.0, 150.0, 5.0), slice(200.0, 300.0, 10.0)]
(这是@Moses对iter
的使用的替代方案)。但是在np.r_
(甚至np.concatenate
)中嵌入此类列表非常棘手。
直接生成arange
可能更容易:
In [189]: subl = [np.arange(*ii) for ii in np.array(ll[1:-1]).reshape(-1,3)]
In [190]: subl
Out[190]:
[array([ 100., 105., 110., 115., 120., 125., 130., 135., 140., 145.]),
array([ 200., 210., 220., 230., 240., 250., 260., 270., 280., 290.])]
In [191]: np.concatenate([[ll[0]]]+subl+[[ll[-1]]])
Out[191]:
array([ 50., 100., 105., 110., 115., 120., 125., 130., 135.,
140., 145., 200., 210., 220., 230., 240., 250., 260.,
270., 280., 290., 400.])