首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新numpy矩阵中单个元素的Pythonic方法?

更新numpy矩阵中单个元素的Pythonic方法?
EN

Stack Overflow用户
提问于 2013-11-22 10:27:19
回答 2查看 1.9K关注 0票数 1

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

代码语言:javascript
复制
m2 = m1.copy()
m2[ 2, 7 ] = 43 # or m2[ 2, 7 ] += 43
f(m2)

有一个优雅的f( ... )单线线来做到这一点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-22 10:38:54

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

代码语言:javascript
复制
f(m2[2,7] = 43)

if (a = 1+2)

我相信你能做到

代码语言:javascript
复制
f( modify_matrix(m1) )

并定义了一个单独的修改m1矩阵的方法。

代码语言:javascript
复制
def modify_matrix(m1):
     m1[2,7] = 2
     return m1

但是上面的选项比较复杂,如果您只需要多添加一行修改矩阵就可以了。

票数 1
EN

Stack Overflow用户

发布于 2013-11-23 01:42:52

看在教育学的份上,这是一种实用的方法。np.where实际上做的正是您想做的事情,但棘手的部分是它接受布尔条件,而不是索引:

代码语言:javascript
复制
f(np.where(condition, 43, m1))

它将43发送到满足condition的任何地方,而在其他地方只发送m1,因此如果我们知道选择要更改的元素的条件,这可能会更简单。因此,最棘手的部分是创建布尔数组,无论如何,这有点浪费。

代码语言:javascript
复制
np.where(np.all(np.indices(m1.shape) == np.array([2, 7])[:, None, None], 0), 43, m1)

或相当于:

代码语言:javascript
复制
np.where(np.all(np.rollaxis(np.indices(m1.shape),0,3) == np.array([2, 7]), -1), 43, m1)

我可以发誓,有一个等价的函数,它采用索引而不是掩码,但不幸的是,似乎类似的函数(np.put,例如)这样,索引就可以修改数组,而不是从功能上返回一个新的数组。np.choose也可以工作,但在创建“选择”数组(相对于条件掩码数组)方面存在相同的问题。

在行动中:

代码语言:javascript
复制
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.]])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20142545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档