Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新numpy矩阵的单个元素的Python方法?_Python_Numpy_Matrix - Fatal编程技术网

更新numpy矩阵的单个元素的Python方法?

更新numpy矩阵的单个元素的Python方法?,python,numpy,matrix,Python,Numpy,Matrix,假设我有一个函数调用f(m1),其中m1是一个numpy矩阵。现在,我想在一个矩阵上调用f,这个矩阵与m1几乎相同: m2 = m1.copy() m2[ 2, 7 ] = 43 # or m2[ 2, 7 ] += 43 f(m2) 是否有一个优雅的f(…)一行程序可以做到这一点?在python中,每个赋值都是一个语句而不是一个表达式,因此您不能- f(m2[2,7] = 43) 或 如果(a=1+2) 我相信你能做到 f( modify_matrix(m1) ) 并定义了修改m1矩阵的

假设我有一个函数调用
f(m1)
,其中
m1
是一个numpy矩阵。现在,我想在一个矩阵上调用
f
,这个矩阵与
m1
几乎相同:

m2 = m1.copy()
m2[ 2, 7 ] = 43 # or m2[ 2, 7 ] += 43
f(m2)

是否有一个优雅的
f(…)
一行程序可以做到这一点?

在python中,每个赋值都是一个语句而不是一个表达式,因此您不能-

f(m2[2,7] = 43)

如果(a=1+2)

我相信你能做到

f( modify_matrix(m1) )
并定义了修改m1矩阵的单独方法

def modify_matrix(m1):
     m1[2,7] = 2
     return m1

但是,如果您只需再添加一行修改矩阵,则上述选项会更加复杂。

在python中,每个赋值都是语句而不是表达式,因此您不能-

f(m2[2,7] = 43)

如果(a=1+2)

我相信你能做到

f( modify_matrix(m1) )
并定义了修改m1矩阵的单独方法

def modify_matrix(m1):
     m1[2,7] = 2
     return m1

但是,如果您只需再添加一行修改矩阵,则上述选项更为复杂。

出于教学的考虑,下面是一种功能性方法
np。其中
实际上正是您想要的,但棘手的是它接受布尔条件,而不是索引:

f(np.where(condition, 43, m1))
它将
43
发送到
f
任何满足
条件的地方,在其他地方它只发送
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
也可以工作,但在创建“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.]])

从教育学的角度来看,这里有一个实用的方法
np。其中
实际上正是您想要的,但棘手的是它接受布尔条件,而不是索引:

f(np.where(condition, 43, m1))
它将
43
发送到
f
任何满足
条件的地方,在其他地方它只发送
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
也可以工作,但在创建“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.]])

这正是做这件事的方法。但是,如果您的代码的组织方式使您可以同时生成
m1
m2
,那么可能会有一种更优雅、更高效的方法来实现这一点。这正是实现这一点的方法。但是,如果代码的组织方式使您可以同时生成
m1
m2
,那么可能会有一种更优雅、更高效的方法。