Zak*_*Zak 5 python numpy python-2.7
我有一个 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])
Run Code Online (Sandbox Code Playgroud)
请注意,我必须复制a1. 我使用它的目的是包装一个将数组作为输入的函数,因此我可以将其提供给优化器,该优化器将改变其中一些元素。
因此,理想情况下,我希望在一行中返回原始文件的修改副本,其工作方式如下:
a2 = np.replace(a1, ind, x)
Run Code Online (Sandbox Code Playgroud)
原因是我需要像这样应用它:
def somefunction(a):
....
costfun = lambda x: somefunction(np.replace(a1, ind, x))
Run Code Online (Sandbox Code Playgroud)
随着a1与ind不变,这将然后给我一个costfunction这是只有x的函数。
我目前的后备解决方案是自己定义一个小函数:
def replace(a1, ind, x):
a2 = np.copy(a1)
a2.put(ind,x)
return(a2)
Run Code Online (Sandbox Code Playgroud)
...但这对我来说似乎不是很优雅。
=> 有没有办法把它变成一个 lambda 函数?
好吧,你要求一个单行,这是一个使用稀疏矩阵的单行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]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1364 次 |
| 最近记录: |