python – Numpy:通过切片查看vs复制
发布时间:2020-12-16 23:01:30 所属栏目:Python 来源:网络整理
导读:当我正在进行切片时,发生了意想不到的事情,这似乎是第一个被查看但第二个是复制. 第一 第一片行,然后是片段.这似乎是一种观点. a = np.arange(12).reshape(3,4) a[0:3:2,:][:,[0,2]] = 100 aarray([[100,1,100,3],[ 4,5,6,7],[100,9,11]]) 第二 但是,如果我
当我正在进行切片时,发生了意想不到的事情,这似乎是第一个被查看但第二个是复制.
第一 第一片行,然后是片段.这似乎是一种观点. >>> a = np.arange(12).reshape(3,4) >>> a[0:3:2,:][:,[0,2]] = 100 >>> a array([[100,1,100,3],[ 4,5,6,7],[100,9,11]]) 第二 但是,如果我第一次切片,然后切片行,它似乎是一个副本: >>> a[:,2]][0:3:2,:] = 0 >>> a array([[100,11]]) 我很困惑,因为这两种方法最终会导致看似位置改变,但为什么第二种方法实际上不会改变数字? 解决方法
重要的是你是按行还是按列切片.按行切片可以返回视图,因为它是原始数组的连续段.按列切片必须返回副本,因为它不是连续的段.例如:
A1 A2 A3 B1 B2 B3 C1 C2 C3 默认情况下,它以这种方式存储在内存中: A1 A2 A3 B1 B2 B3 C1 C2 C3 所以如果你想选择每一行,那就是: [A1 A2 A3] B1 B2 B3 [C1 C2 C3] 这可以描述为{start:0,size:3,stride:6}. 但是如果你想选择每一个第二列: [A1] A2 [A3 B1] B2 [B3 C1] C2 [C3] 并且无法使用单个开始,大小和步幅来描述.所以没有办法构建这样的视图. 如果您希望能够查看每个第二列而不是每隔一行,则可以使用列主要的Fortran命令构建数组: np.array(a,order='F') 然后它将被存储为: A1 B1 C1 A2 B2 C2 A3 B3 C3 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |