我最近将解决方案应用于平均每N行矩阵。尽管该解决方案总体上可行,但将其应用于7x1阵列时遇到了问题。我注意到问题出在使用-=
运算符时。举一个小例子:
因此,在数组的情况下a -= b
产生的结果与有所不同a = a - b
。我认为到目前为止,这两种方式是完全相同的。有什么区别?
我提到的用于对矩阵中的每N行求和的方法如何工作(例如,对于7x4矩阵而不是7x1数组)?
python运算符中is和==有什么区别?这篇文章运用了实例代码展示,代码非常详细,可供感兴趣的小伙伴们参考借鉴,希望对大家有所帮助。
在讲解is和==区别直接先讲解一下内置函数id(),其实在文章 python可变数据类型和不可变数据类型 中也对内置函数id()有过讲解,主要用于获取变量的内存地址!关于内存现在不做过多讲解,你可以把内存地址当作一串数字符号,内存地址就好比每个人都有一个身份证号码一样!
@File:python_进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。 |
==操作符检查两者的值是否相等,而is运算符则检查两个操作数是否引用相同的对象。
这显示list1和list2引用了不同的对象。
我最近将解决方案应用于平均每N行矩阵。尽管该解决方案总体上可行,但将其应用于7x1阵列时遇到了问题。我注意到问题出在使用-=
运算符时。举一个小例子:
因此,在数组的情况下a -= b
产生的结果与有所不同a = a - b
。我认为到目前为止,这两种方式是完全相同的。有什么区别?
我提到的用于对矩阵中的每N行求和的方法如何工作(例如,对于7x4矩阵而不是7x1数组)?
注意:从1.13.0版开始,在共享内存的NumPy数组上使用就地操作不再是问题(请参阅详细信息)。这两个操作将产生相同的结果。此答案仅适用于NumPy的早期版本。
在计算中使用数组时对其进行突变可能会导致意外结果!
在问题的示例中,用减去可-=
修改的第二个元素,a
然后立即在对的第三个元素的运算中使用该修改的第二个元素a
。
就地减法-=
开始。的第一个元素a[:-1]
1减去的第一个元素a[1:]
。这已修改a
为[1, 1, 3]
。现在,我们有一个a[1:]
是数据的视图[1,
3]
,并且a[:-1]
是数据的视图[1, 1]
(阵列的第二元件a
已被更改)。
a[:-1]
现在是[1, 1]
,NumPy现在必须从的第二个元素减去其第二个元素1(现在不再是 2!)a[1:]
。这样就a[1:]
可以看到这些值[1, 2]
。
b[:-1]创建一个新数组,然后将该数组中的值分配给b[1:]
。b
在减法期间它不会自行修改,因此视图b[1:]
和b[:-1]
不会更改。
一般建议是,如果一个视图重叠,则应避免在一个视图之间进行修改。这包括运算符-=
,*=
等,并out
在通用函数(如np.subtract
和np.multiply
)中使用参数写回数组之一。
与当前接受的答案相比,我更喜欢此答案。它使用非常清晰的语言来显示在适当位置修改可变对象的效果。更重要的是,最后一段直接强调了对重叠视图进行就地修改的重要性,这应该是从这个问题中吸取的教训。
在某些情况下,__sub__()
并__isub__()
以类似的方式工作。但是可变对象应该在使用时发生变异并返回自己__isub__()
,而它们应该使用来返回一个新对象__sub__()
。
在numpy对象上应用切片操作会在其上创建视图,因此使用它们直接访问“原始”对象的内存。
Python中的增强赋值背后的想法是,它不仅是编写将二进制运算的结果存储在其左操作数中的通用做法的简便方法,而且还是一种用于所讨论的左操作数的方法。知道它应该“自己”操作,而不是创建自己的修改副本。
x-y)是x=x.__sub__(y)
。在像整数这样的非可变对象上,它是等效的。但是对于像数组或列表这样的可变变量,如您的示例所示,它们可能是完全不同的东西。