numpy陷阱之fancy indexing生成copy

numpy在用python传统的slicing做index,和其自定义的numpy.array/list做index时的表现不同,非常坑人。。。
翻译自此文档:https://scipy-cookbook.readthedocs.io/items/ViewsVsCopies.html

  1. 什么是fancy index:详见numpy文档 。简单的说,除了传统的slicing(即start:end:step),只有可解释为slicing的tuple(如a[(1,2)] == a[1,2] in numpy) 不是fancy index。tuple的例子还有a[(1:-1,2)]a[(1, Ellipsis, 1)] == a[1,...,1]不是fancy index,而a[(1,2),]则是fancy index了(因为无法解释为传统slicing)。
  2. fancy index和传统index的输出大不同:fancy index输出的是copy,而传统index输出的是view。还需声明的是,此不同仅存在在__getattr__()中,__setattr__()不需要生成view/copy,故不存在此区别
    下面是一个著名的例子:
>> a = numpy.arange(12).reshape(3,4)
>>> ifancy = [0,2]
>>> islice = slice(0,3,2)
>>> a[islice, :][:, ifancy] = 100
>>> a
array([[100,   1, 100,   3],
       [  4,   5,   6,   7],
       [100,   9, 100,  11]])
>>> a = numpy.arange(12).reshape(3,4)
>>> ifancy = [0,2]
>>> islice = slice(0,3,2)
>>> a[ifancy, :][:, islice] = 100  # note that ifancy and islice are interchanged here
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
  1. view和copy的区别:网上资料很多,简单地说就是view是share memory即data的;而copy是不share的,完全独立于原始数据的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值