2016-07-29 58 views
4

我有一個Numpy數組和一個索引列表,以及一個需要進入這些索引值的數組。函數返回np.array的副本替換了一些元素

我知道如何實現最快捷的方式是這樣的:

In [1]: a1 = np.array([1,2,3,4,5,6,7]) 

In [2]: x = np.array([10,11,12]) 

In [3]: ind = np.array([2,4,5]) 

In [4]: a2 = np.copy(a1) 

In [5]: a2.put(ind,x) 

In [6]: a2 
Out[6]: array([ 1, 2, 10, 4, 11, 12, 7]) 

通知我不得不做出的a1副本。我使用這個的是打包一個函數,它將一個數組作爲輸入,所以我可以把它給一個優化器,它將改變這些元素的的一些

所以,理想情況下,我想有一些東西,返回原始的修改後的副本,在一個線,即是這樣的:

a2 = np.replace(a1, ind, x) 

其原因是,我需要申請它像這樣:

def somefunction(a): 
    .... 

costfun = lambda x: somefunction(np.replace(a1, ind, x)) 

隨着a1ind不變,這將然後給我一個costfunction這是隻有x的函數。

我現在的後備解決方案是定義一個小功能自己:

def replace(a1, ind, x): 
    a2 = np.copy(a1) 
    a2.put(ind,x) 
    return(a2) 

...但是這似乎不是很優雅給我。

=>有沒有辦法將它變成lambda函數?

+1

有什麼都沒有錯小,甚至內部功能。 –

+2

我敢打賭,即使'numpy'提供了這樣一個功能,它看起來就像你的。或者''''參數更復雜,並且可以處理標量,列出一個布爾輸入。以'np.insert'爲例。我只寫了一個案例的插入簡化解釋。 http://stackoverflow.com/a/38667908/901925 – hpaulj

回答

2

嗯,你問一個班輪,這裏使用的稀疏矩陣與Scipy's csr_matrix是一個 -

In [280]: a1 = np.array([1,2,3,4,5,6,7]) 
    ...: x = np.array([10,11,12]) 
    ...: ind = np.array([2,4,5]) 
    ...: 

In [281]: a1+csr_matrix((x-a1[ind], ([0]*x.size, ind)), (1,a1.size)).toarray() 
Out[281]: array([[ 1, 2, 10, 4, 11, 12, 7]]) 
+0

哇,這是我第一次尋找一個numpy函數,它不會比我預期的更簡單,更易於閱讀。我仍然在使用它,但這是問題的答案... – Zak