假设我有一个函数调用f(m1),其中m1是一个numpy矩阵。现在,我想在一个几乎与f完全相同的矩阵上调用m1
m2 = m1.copy()
m2[ 2, 7 ] = 43 # or m2[ 2, 7 ] += 43
f(m2)有一个优雅的f( ... )单线线来做到这一点吗?
发布于 2013-11-22 10:38:54
在python中,每个赋值都是语句而不是表达式,所以您不能-
f(m2[2,7] = 43)或
if (a = 1+2)
我相信你能做到
f( modify_matrix(m1) )并定义了一个单独的修改m1矩阵的方法。
def modify_matrix(m1):
m1[2,7] = 2
return m1但是上面的选项比较复杂,如果您只需要多添加一行修改矩阵就可以了。
发布于 2013-11-23 01:42:52
看在教育学的份上,这是一种实用的方法。np.where实际上做的正是您想做的事情,但棘手的部分是它接受布尔条件,而不是索引:
f(np.where(condition, 43, m1))它将43发送到满足condition的任何地方,而在其他地方只发送m1,因此如果我们知道选择要更改的元素的条件,这可能会更简单。因此,最棘手的部分是创建布尔数组,无论如何,这有点浪费。
np.where(np.all(np.indices(m1.shape) == np.array([2, 7])[:, None, None], 0), 43, m1)或相当于:
np.where(np.all(np.rollaxis(np.indices(m1.shape),0,3) == np.array([2, 7]), -1), 43, m1)我可以发誓,有一个等价的函数,它采用索引而不是掩码,但不幸的是,似乎类似的函数(np.put,例如)这样,索引就可以修改数组,而不是从功能上返回一个新的数组。np.choose也可以工作,但在创建“选择”数组(相对于条件掩码数组)方面存在相同的问题。
在行动中:
In [66]: m1 = np.zeros((4, 9))
In [67]: np.where(np.all(np.indices(m1.shape) == np.array([2, 7])[:,None, None], 0), 43, m1)
Out[67]:
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 43., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
In [68]: np.where(np.all(np.rollaxis(np.indices(m1.shape),0,3) == np.array([2, 7]), -1), 43, m1)
Out[68]:
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 43., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0.]])https://stackoverflow.com/questions/20142545
复制相似问题