2016-07-23 83 views
1

我有以下列表:合併項目進行分隔蟒蛇

[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

不應該'100.0:150。0:5'是一個字符串? –

+0

我將用戶提供的列表作爲字符串[50.0,100.0:150:5.0,200.0:300.0:10.0,400.0],然後將其分隔到分隔符'::'上,以便我可以將其轉換爲浮點數。現在我想添加回':'分隔符。 Numpy_r不會將輸入作爲字符串,因此間隔100.0:150.0:5.0和200.0:300.0:10.0不能是字符串 – user1332577

+0

我希望它們是浮動的。 numpy.r_使用逗號分隔的數組。 – user1332577

回答

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的並且把它們放在片的numpy的方法是:

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

(這是一個alterantive爲@摩西使用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.]) 
+0

這真的很有用,特別是你用不同的方式展示如何做這個。我想我喜歡你提供的np.r_ [ll [0],slice(* ll [1:4]),slice(* ll [4:7]),ll [7]]解決方案。我可以怎樣做這個循環,說我知道我需要的指標':'分隔符,這樣做會非常容易嗎? – user1332577

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

這將產生你想要的結果。

+0

這就是我所要求的鑑於我提供的清單謝謝。有沒有辦法在提供的例子中使用索引,並只將切片應用於索引值?我很好奇數組是如何讀出實際值的。我注意到,當我將它輸入到numpy.r_時,它提供了數組作爲對象,輸出如數組([50.0,slice(100.0,150.0,5.0),slice (200.0,300.0,10.0),400.0],dtype = object)。我如何得到它打印出數組中的所有實際值供使用? – user1332577

+0

@ user1332577我已經添加了一部分,可以幫助您構建您想要的數組 –

+0

摩西,任何想法如何實現這個隨機的列表。也就是說,上述映射不適用於像[50:100:5,100:200:5,200,300:400:5,500,600:700:10,800,900,1000]或另一個隨機列表,如[50,75,100:200:10,200,300:400 :10400500600:800:20900]。我試圖弄清楚如何使它每次都具有多功能性 – user1332577