python – numpy数组切片中的意外结果(view vs copy)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – numpy数组切片中的意外结果(view vs copy),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1430字,纯文字阅读大概需要3分钟。
内容图文
![python – numpy数组切片中的意外结果(view vs copy)](/upload/InfoBanner/zyjiaocheng/817/0b681ed1427c47b491c15c05d52afc0b.jpg)
我正在尝试减少代码中的复制量,并且在处理numpy数组切片和视图时遇到了令人惊讶的行为,如下所述:
Scipy wiki page on copying numpy arrays
我偶然发现了以下行为,这对我来说意外:
情况1.:
import numpy as np
a = np.ones((3,3))
b = a[:,1:2]
b += 5
print a
print b.base is a
正如所料,这输出:
array([[ 1., 6., 1.],
[ 1., 6., 1.],
[ 1., 6., 1.]])
True
案例2:在一行中执行切片和添加时,事情看起来不同:
import numpy as np
a = np.ones((3,3))
b = a[:,1:2] + 5
print a
print b.base is a
对我来说令人惊讶的部分是[:,1:2]似乎没有创建一个视图,然后将其用作左侧参数,因此,此输出:
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
False
也许有人可以解释为什么这两个案例不同,我想我错过了什么.
解决方案:我错过了一个显而易见的事实,即除了就地操作符“=”之外的“”运算符将始终创建一个副本,因此它实际上不是相关的,而是切片,而不是为numpy数组定义就地运算符.
为了说明这一点,以下内容生成与案例2相同的输出:
import numpy as np
a = np.ones((3,3))
b = a[:,1:2]
b = b + 5
print a
print b.base is a
解决方法:
以上情况与:
>>> a=np.arange(5)
>>> b=a
>>> b
array([0, 1, 2, 3, 4])
>>> b+=5
>>> a
array([5, 6, 7, 8, 9])
>>> b
array([5, 6, 7, 8, 9])
>>> b=b+5
>>> b
array([10, 11, 12, 13, 14])
>>> a
array([5, 6, 7, 8, 9])
至少在我看来,这似乎是完全预期的行为. b = x运算符调用__iadd__,重要的是首先尝试修改数组,因此它将更新b仍然是a的视图.而b = b x运算符调用__add__,它会创建新的临时数据,然后将其分配给b.
对于a [i] = b,序列是(numpy):
a.__setitem__(i, a.__getitem__(i).__iadd__(b))
内容总结
以上是互联网集市为您收集整理的python – numpy数组切片中的意外结果(view vs copy)全部内容,希望文章能够帮你解决python – numpy数组切片中的意外结果(view vs copy)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。