一. Numpy的主要功能
- 数组的算数和逻辑运算。
- 傅立叶变换和用于图形操作的例程。
- 线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。
二. Numpy的基本数据结构
Numpy提供的核心功能是数组,所以它的最基本的数据结构就是多维数组结构Ndarray。Ndarray无论是运算速度,还是功能函数都比list结构要更好。该结构的特点如下:
- 数组中所有的元素类型相同。
- 每个元素在内存中的块大小相同。
- 数组的维度信息存放在shape属性,类型信息存放在dtype属性。
三. Ndarray结构的基本使用
1. 创建Ndarray
- 直接使用np.array()创建
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
object参数,接受一切序列型的对象,用于创建数组。
dtype参数,为数组指定一个类型
order参数,(C语言风格)按行显示数组='C'; 或者(Fortran语言风格)按列显示数组='F'
ndmin参数,指定数组的最小维度
# 最小维度
import numpy as np
a = np.array([1, 2, 3, 4, 5], ndmin = 2, dtype=np.float) #本来是一维数组,强行控制它为二维数组
print (a)
Out:
[[1.0, 2.0, 3.0, 4.0, 5.0]]
- 固定填充元素创建
创建空数组:numpy.empty (shape, dtype = float, order = 'C')
创建全0数组:numpy.zeros (shape, dtype = float, order = 'C')
创建全1数组:numpy.ones (shape, dtype = None, order = 'C')
shape参数,整数表示一维数组的长度,元组表示多维数组的形状。
从已有数据中创建
从其他序列创建numpy.asarray(object, dtype = None, order = None)
该函数类似于np.array(),主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。
从迭代器创建numpy.fromiter(iterable, dtype, count = -1)
count参数,读取的数据量,-1表示所有数据给定范围生成数组
-
按步长
numpy.arange(start, stop, step, dtype)
-
按间隔数量
numpy.linspace(start, stop, num, endpoint, retstep, dtype)
2. Ndarray的常用属性
- ndarray.shape 数组维度
- ndarray.dtype 数组类型
- ndarray.ndim 数组最小维度
- ndarray.itemsize 数组每个元素的字节长度
3. Ndarray的切片与索引
- 下标索引:同Python,下标从0开始。
- 切片:与Python相同,Ndarray的切片依旧使用
[开始下标:终止下标(不包含):步长]
的格式。
可以使用省略号...
,表示某个维度的所有元素
arr=np.asarray([[1,2,3,4],[5,6,7,8]])
print(arr)
print(arr[...,1])# 打印第2列所有元素
Out:
[[1 2 3 4]
[5 6 7 8]]
[2 6]
注意:Numpy切片与Python序列切片最大的不同在于,ndarray切片返回值是原数组的视图,修改切片会影响原数组;而Python序列的切片返回值是副本,与原序列没关系。如果需要ndarray的切片副本,需要显示复制a=arr[2:5].copy()
4. Ndarray的高级索引
- 整数索引
以前访问多维数组的时候,我们使用多个中括号来表达不同的轴,比如下图。这种方式一次只能访问一个元素。
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[1][0])
Out:
[[2 3 4]
[6 7 8]
[1 1 1]]
6
如果我们使用的中括号的数量小于数组的维度,那么更高级的轴将被全选,比如下图。
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[1])
out:
[[2 3 4]
[6 7 8]
[1 1 1]]
[6 7 8]
但是对于更高级的轴,我们不想全选,只想选取若干个怎么办?这时Ndarray的特点就显现了。他可以对每个轴都进行选择,用逗号隔开每个轴之间的下标,按顺序构成坐标对,举个例子,下图中,第一个中括号表示对第一个轴的选取,第二个中括号是对第二个轴的选取,两个轴按顺序构成坐标对(0,1),(1,2),得到这2个位置的数据
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[ [0,1],[1,2] ])
Out:
[[2 3 4]
[6 7 8]
[1 1 1]]
[3 8]
上面是按照坐标对来选择的,如果想选择某块数据怎么办?我们可以按轴切片,轴切片之间用逗号隔开,举个例子。
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[:2,1:])
Out:
[[2 3 4]
[6 7 8]
[1 1 1]]
[[3 4]
[7 8]]
敲黑板,总结 一下整数索引:
- 老旧方法:1. 使用与维度数目一样的中括号来访问单个元素;2. 使用少于维度数目的中括号访问一片高维度数据。
- Ndarray独有方法:在中括号内对所有轴做选择,不同轴用逗号隔开
arr[轴1,轴2,轴3]
,枚举下标要用中括号包裹起来,切片不用包裹,二者可以混用。举个栗子:
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[ [0,1],1: ])
Out:
[[2 3 4]
[6 7 8]
[1 1 1]]
[[3 4]
[7 8]]
- 布尔索引
之前我们在某个维度选取元素的时候,使用的都是整数下标,其实可以不用下标的,而是用布尔数组,但是要求布尔数组和这个维度的长度一致。举个例子,假设我们要选择第二行所有数据:
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[ [False,True,False] ])
Out:
[[2 3 4]
[6 7 8]
[1 1 1]]
[[6 7 8]]
或者选择第二行,第二列和第三列的数据。方法和整数索引一样,不同的是,这次用布尔数组。
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[[False,True,False],[False,True,True]])
Out:
[[2 3 4]
[6 7 8]
[1 1 1]]
[7 8]
其实Ndarray做逻辑运算的时候,会返回一个布尔数组,我们可以利用这一点,直接进行数据选择:
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print(arr)
print (arr>2)
print(arr[arr>2])
Out:
[[2 3 4]
[6 7 8]
[1 1 1]]
[[False True True]
[ True True True]
[False False False]]
[3 4 6 7 8]
最后强调一点,布尔数组必须和筛选维度的长度一致!!!!