Numpy知识点回顾与学习
什么是Numpy?
Numpy使用Python进行科学计算的基础包。因为机器学习当中很多都会用到数组、线性代数等知识,经常需要和数组打交道,所以Numpy学习成为了科研之路上必须掌握的一门技能。Numpy包含以下的内容:
- 一个强大的N维数组对象,可以通过这个对象进行矩阵的运算。
- 复杂的(广播)功能。
- 用于集成C/C++代码的工具。
- 有用的线性代数,傅里叶变换和随机数功能。
- 可以作为**通用数据的高校多维容器,定义任意的数据类型。**可以与各种数据库集成。
Numpy数据类型
Numpy支持比Python更多的数据类型。
比如:
- 5种基本数字类型:布尔型(bool),整数(int),无符号整数(uint),浮点数和复数。
- 8位长、16位长、32位长、64位长的整型数字和无符好整型数字
Numpy创建数组
- numpy.array([需要的数组])
- numpy.empty(shape,dtype=float,order=‘C’)
- shape为数组形状,例如[3,2]
- dtype为数据类型,为可选
- order为内存中存储元素的顺序,有’c’和‘f’两种方式,代表行优先和列优先。
- numpy.zeros(shape,dtype,order=‘C’)
- 创建指定形状的数组,数组元素以0来填充
- numpy.ones(shape,dtype,order=‘C’)
- 创建指定形状的数组,数组元素以1来填充
- numpy.zeros_like()
- 创建与某个数组形状相同的数组,所有元素为0
- numpy.ones_like()
- 创建与某个数组形状相同的数组,所有元素为1
- numpy.asarray()
- 创建数组,可以将列表、元组转化为数组
- numpy.arange(start,stop,step,dtype)
- 根据起始和终止设置范围,step设置为步长,生成ndarray
- numpy.linespace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)
- 根据样本的起始和终止位置,以及样本数,设置是否包含stop的值,retstep为间距,为等差数列
- numpy.logspace(start,stop,num,endpoint,base,dtype)
- 基本同linespace,base是指去对数的时候log的下标。创建一个等比数列
#创建数组的各种方法
print(np.array([[1,2,3],[4,5,6]]))
print(np.arange(10,20,2))
a = [(1,2,3),(4,5,6)]
print(np.asarray(a))
print(np.ones((4,3),int,'c')) print(np.linspace(10,20,5,False,True,float)) print(np.logspace(0,9,10,True,base=2))
## Numpy的切片和索引
Numpy对象的内容可以通过索引和切片用来访问和修改,与Python中list的切片一样。
切面与索引举例:
#单维数组
a = np.arange(10)
print(slice(2,7,2))
print(a[2:7:2])
print(a[2:]) #多维数组
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print(a[1:]) #输出第二行和第三行
print(a[...,1]) #第二列元素
print(a[1,...]) #第二行元素
print(a[...,1:]) #第二列以及后面的所有元素
高级索引
-
整数数组索引
-
一个数组访问另外一个数组,这个数组中的元素都是目标数组的某个维度的索引值。
import numpy as np x = np.array([[1, 2], [3, 4], [5, 6]]) y = x[[0,1,2], [0,1,0]] #访问(0,0),(1,1,),(2,0)这三个位置的元素 print (y)
-
-
布尔索引
- 通过布尔运算,来获取符合指定条件的元素的数组。
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print(x[x>5])a = np.array([np.nan, 1,2,np.nan,3,4,5]) print (a[~np.isnan(a)])a = np.array([1, 2+6j, 5, 3.5+5j]) print (a[np.iscomplex(a)])
-
花式索引
- 花式索引指的是利用整数数组进行索引。 **花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。**花式索引跟切片不一样,它总是将数据复制到新数组中。
x=np.arange(32).reshape((8,4)) print(x) # 二维数组读取指定下标对应的行 print("-------读取下标对应的行-------") print (x[[4,2,1,7]])
Numpy广播
广播(Broadcast)是numpy对不同形状的数组进行数值计算的方式。
#如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a * b
print (c)
#当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制
a = np.array([[ 0, 0, 0], [10,10,10], [20,20,20], [30,30,30]])
b = np.array([0,1,2])
print(a + b)
"""
输出结果为:
[[ 0 1 2]
[10 11 12]
[20 21 22]
[30 31 32]]
"""
广播的规则:
- 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
- 输出数组的形状是输入数组形状的各个维度上的最大值。
- 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
- 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。