对比 Python 原生切片,讲述 Numpy 数组切片!

本文详细介绍了Python原生切片与NumPy数组切片的区别,包括浅拷贝与视图的概念。通过实例展示了在修改切片内容时,原生列表与NumPy数组的不同行为。同时,解释了如何在NumPy中正确使用切片,包括切片的语法和注意事项,并提供了多个示例帮助理解切片操作。
摘要由CSDN通过智能技术生成

1. 本文介绍

今天为大家介绍以下内容:

  • Ⅰ Python原生切片,与numpy数组切片,有哪些不同?

  • Ⅱ numpy中,应该如何使用切片?


2. Python原生切片,与numpy数组切片,有哪些不同?

这里有两个概念,大家需要了解一下。

  • 浅拷贝:相当于B将A的数据,复制了一遍,并在本地从新开了一片内存区域,用于存放B。此时,改变A/B中的数据,并不会影响对方;

  • 视图:相当于B和A共用一块儿内存区域,当改变A/B中的数据,对方也会跟着改变;

① 数组切片,返回的是原始数组的视图
list1 = [1,2,3]
print(list1)
list2 = list1[1:]
print(list2)

# 此时,修改list2中某一个元素,查看原始列表的元素是否发生变化?
list2[0] = 666
print(list2)
print(list1)

结果如下:

可以发现:修改list2中的元素后,list1中的元素并没有改变。

② 原生python切片,返回的是原始数组的浅拷贝
array1 = np.array([1,3,5,2,4])
print(array1)
array2 = array1[2:]
print(array2)

# 此时,修改array2中某一个元素,查看原始数组的元素是否发生变化?
array2[0] = 888
print(array2)
print(array1)

结果如下:

可以发现:修改array2中的元素后,array1中的元素跟着改变了。

③ 调用数组对象的copy方法,实现底层数据的复制,而不是返回底层数据的视图
array3 = np.array([1,2,3,4,5,6])
print(array3)
array4 = array3.copy()
print(array4)

array4[2] = 666
print(array4)
print(array3)

结果如下:

可以发现:修改array4中的元素后,array3中的元素没有变。

3. numpy中,应该如何使用切片?

切片的使用,不管是原生python切片,还是数组切片,语法基本上是相同的。

  • 语法:[start:stop:step]

  • 参数:start代表起始索引,stop代表终止索引,step代表步长;

对于切片,这里有几点需要注意的。

  • 注意1:索引是左臂右开区间,比如说x[0:9:1],只能是取到索引等于0处的元素到索引等于8处的元素,而取不到索引等于9的这个元素。记住元素索引都是0开始的,第一个亓素的索引是0.第一个亓素的索引是1,以此类推下去。

  • 注意2:当不写start代表从起始索引处取数,当不写stop代表一直取数到最后位置。当不写step步长,代表使用默认步长1。

  • 注意3:start、stop、step都可以是负数,具体什么含义,最好在下面的例子中好好体会。

黄同学做了一张图,帮你理解“切片”。

下面用几个例子,来好好练习一下吧!

a = np.arange(10)
print(a)             # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

print(a[:3])          # 0 1 2
print(a[3:6])         # 3 4 5
print(a[6:])          # 6 7 8 9
print(a[::])          # 0 1 2 3 4 5 6 7 8 9
print(a[:])           # 0 1 2 3 4 5 6 7 8 9
print(a[::3])         # 0 3 6 9
print(a[1::3])        # 1 4 7
print(a[2::3])        # 2 5 8

# 当start、stop、step为负数的时候,理解起来就稍微难一点;
print(a[::-1])        # 9 8 7 6 5 4 3 2 1 0
print(a[:-4:-1])      # 9 8 7 
print(a[-4:-7:-1])    # 6 5 4
print(a[-7::-1])      # 3 2 1 0

结果如下:

更多阅读

用 Python 进行 OCR 图像识别

用 XGBoost 进行时间序列预测

5 分钟快速上手 pytest 测试框架

特别推荐


点击下方阅读原文加入社区会员

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值