2017-05-12 117 views
1

我有一個大小不同的列表,我想將它複製到numpy數組中。我已經有辦法做,但我想看看是否有更優雅的方式。將列表複製到numpy數組的一部分

比方說,我有以下幾點:

import numpy as np 
data = np.full((10,), np.nan) 

# I want to copy my list into data starting at index 2 
def apply_list(my_list): 
    data[2:2+len(mylist)] = mylist 

# Example 
tmp = [1, 2, 3, 4]  # can vary from 2 to 8 elements 
apply_list(tmp) 

在此之後,我預計的數據是這樣的:

[nan, nan, 1, 2, 3, 4, nan, nan, nan, nan] 

請記住,len(mylist)範圍從2至8

我正在使用NaN標記未使用的位置,並且數據已被預分配,並且始終應爲size = 10,而不管my_list的大小。出於這個原因,簡單的追加將無法工作。

我特別不喜歡做多2:2+len(mylist)。有沒有更好的/更清潔的方式來做到這一點?

+3

這是完成這項工作最簡單的方法。 – hpaulj

+0

是否有某種方式將此與某個迭代器/生成器結合? (顯然不需要用普通的python進行迭代)。我知道np.fromiter,但不知道如何將它連接到作業 – purpletentacle

+0

你在尋找速度還是漂亮的代碼? – hpaulj

回答

1

我不知道任何可以簡化這個的numpy函數。然而,你可以把它包裝成函數,因此複雜性都隱藏:

def put(arr, subarr, startidx): 
    arr[startidx:startidx+len(subarr)] = subarr 
    return arr 

或連續索引(不推薦):

def put(arr, subarr, startidx): 
    arr[startidx:][:len(subarr)] = subarr 
    return arr 

你也可以墊你mylistNaN S:

np.pad(np.array(mylist, dtype=float), 
     (2, 8-len(mylist)), 
     mode='constant', 
     constant_values=np.nan) 
+0

我喜歡填充的想法,但是,我不知道性能.. – purpletentacle

+0

對不起,詢問「不推薦」的一個..但它看起來很有趣。我從來沒有想過它。爲什麼不說不推薦? – purpletentacle

+0

我認爲填充不是高性能的,其他的會更快。我的意思是我不會推薦第二種方法,因爲它只是通過添加不可讀的雙重切片操作來避免「startidx +」。 – MSeifert

相關問題