繁体   English   中英

numpy切片和索引不同的结果

[英]numpy slicing and indexing different results

在通过任何切片,掩蔽或花式索引操作获得的numpy子数组中,只是对原始数组的视图,可以如下所示:

$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.__version__
'1.11.0'

>>> a = np.arange(3); a[:2] = 111; a
array([111, 111,   2])

>>> a = np.arange(3); a[a<2] = 111; a
array([111, 111,   2])

>>> a = np.arange(3); a[[0,1]] = 111; a
array([111, 111,   2])

在上面的例子中,整个子阵列被分配给。 但是,如果我们分配给子数组的一个元素,则切片操作的结果仍然表现为视图,而屏蔽和花式索引操作的结果表现为独立副本:

>>> a = np.arange(3); a[:2][0] = 111; a
array([111,   1,   2])

>>> a = np.arange(3); a[a<2][0] = 111; a
array([0, 1, 2])

>>> a = np.arange(3); a[[0,1]][0] = 111; a
array([0, 1, 2])

这是一个numpy的错误,还是设计? 如果是设计,那么这种不一致的证据是什么?

这不是一个错误。 只要将切片对象传递给Numpy数组,返回的子数组就是原始项的视图,这意味着即使切片分配或单项分配也会更改原始数组。 但在其他情况下,返回的结果不是视图。 实际上,它是所选切片的浅视图(副本),它仅支持切片分配,就像Python支持的其他可变对象一样。

文档中也提到了它:

[...]与索引数组一样,返回的是数据的副本,而不是切片所获得的视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM