使用分隔符合并列表中的项

2024-04-25 22:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下清单:

[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间隔值,而对于我的浮点值,我在添加:分隔符时遇到了问题。有人能给我指出正确的方向吗?你知道吗


Tags: 项目字符串numpy列表间隔方向浮点浮点数
2条回答

如果不使用""(即字符串)包装数字,则不能使用:分隔数字。但是,您可以使用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.])

这会产生你想要的结果。你知道吗

我想你说的是做:

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.])

相关问题 更多 >