本篇博客所有示例使用Jupyter NoteBook演示。
Python数据分析系列笔记基于:利用Python进行数据分析(第2版)
目录
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维数组的索引方式:


9045

被折叠的 条评论
为什么被折叠?



