2016-07-29 60 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