函数返回np.array的副本,替换了一些元素

时间:2016-07-29 20:56:23

标签: python python-2.7 numpy

我有一个Numpy数组和一个索引列表,以及一个包含需要进入这些索引的值的数组。

我知道如何实现这一目标的最快方式是:

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不变,这会给我一个只有x的函数的成本函数。

我目前的后备解决方案是自己定义一个小功能:

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

......但这对我来说并不是很优雅。

=>有没有办法把它变成lambda函数?

1 个答案:

答案 0 :(得分: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]])