Python数据分析 | (8)NumPy数组的索引和切片

本篇博客所有示例使用Jupyter NoteBook演示。

Python数据分析系列笔记基于:利用Python进行数据分析(第2版)  

目录

1.基本的索引和切片

2.切片索引

3.布尔型索引

4.花式索引

5.花式索引的等价函数


1.基本的索引和切片

NumPy数组的索引是一个内容丰富的主题,因为选取数据子集或单个元素的方式很多。

  • 一维数组

一维数组很简单,表面上和Python列表的功能差不多:

import numpy as np

arr = np.arange(10)
print(arr)
print(arr[5])
print(arr[5:8])   #切片 访问第5-7个位置的元素(从0开始)
arr[5:8] = 12   #对切片进行赋值  广播  该值会传播到整个选区
print(arr)

数组和列表最重要的区别是,数组切片是原始数组的视图(指向同一块内存),列表的切片是原始列表的一个副本(指向不同的内存,内存中的值相同)。这意味着数据不会被复制,视图上的任何修改都会直接反应到源数组上。

#列表
l = [1,2,3,4,5]
l_slice = l[3:5]       #列表不支持广播操作  数组有广播操作
l_slice[0] = 100      #对列表切片进行修改  不会影响原始列表  列表的切片是原始列表的副本 指向不同内存
print(l_slice)        
print(l)
print("-----------------------")
#数组
arr_slice = arr[5:8]
print(arr)
print(arr_slice)
print("**")
arr_slice[0] = 10000   #对数组切片进行修改  会影响原始数组  数组的切片是原始数组的视图  指向同一块内存
print(arr)
print(arr_slice)
print("**")
arr_slice[:] = 12345   #数组支持广播  [:]全切片  对所有值进行赋值
print(arr)
print(arr_slice)

由于NumPy的设计目的是处理大数据,所以假如NumPy坚持要将数据复制来复制去的话会产生何等性能和内存问题。如果你想要得到的是ndarray切片的一份副本而不是视图,需要明确的进行复制操作:

print(arr)
arr_slice = arr[0:3].copy()   #使用copy() 切片是数组的副本  
arr_slice[0] = -100000       #对切片进行修改 不影响原始数组
print(arr)

 

  • 高维数组

对于高维数组,能做的事情更多。在一个2维数组中,各索引位置上的元素不再是标量而是一个一维数组:

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

#可以对各个元素进行递归访问  以下两种方式等价
print(arr2d[0][2])
print(arr2d[0,2])  #以逗号隔开的索引列表  ,前对第一维取值 后对第2维取值

下图说明了2维数组的索引方式:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值