NumPy Study Notes
❤️ Download
author : zoxiii
Numpy
0、NumPy简介
NumPy的前身为 Numeric,最早由Jim Hugunin与其它协作者共同开发,2005年,Travis Oliphant在Numeric中结合了另一个同性质的程序 Numarray的特色,并加入了其它扩展而开发了NumPy。
Numerical Python 的简称,是Python科学计算的基础包,支持大量的维度数组与矩阵运算
set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None)
常用参数:
- precision:控制输出的小数点个数,默认是8
- threshold:控制输出的值的个数,其余以…代替;
- 当设置打印显示方式threshold=np.nan,意思是输出数组的时候完全输出,不需要省略号将中间数据省略
- suppress: 当suppress=True,表示小数不需要以科学计数法的形式输出
import numpy as np # 导入包
np.set_printoptions(precision=4, suppress=True) # 设置NumPy对象的显示格式
0.1、数据类型ndarray
NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合。
-
以下标0开始;
-
ndarray 中的每个元素在内存中都有相同存储大小的区域;
-
numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算。
-
Numpy底层使用C语言编写,数组中直接存储对象,而不是存储对象指针,所以其运算效率远高于纯Python代码。
-
数组维度(dimensions)也叫做轴(axis),轴的数量就是数组的秩(rank)
a. [ 1 , 2 , 3 , 4 ] [1,2,3,4] [1,2,3,4]是 1 × 4 1\times4 1×4的数组
b. [ [ 0 , 1 , 2 ] , [ 3 , 4 , 5 ] ] [[0,1,2],[3,4,5]] [[0,1,2],[3,4,5]]是 2 × 3 2\times3 2×3的数组,它是二维的,第一个维度长度为2,第二个维度长度为3
-
c. 很多时候可以声明axis
- i. axis=0,表示沿着第0轴进行操作,即对每一列进行操作。
- ii. axis=1,表示沿着第1轴进行操作,即对每一行进行操作。
1、数据生成
1.1、将已有list数据变为ndarraynp.array()
# 创建一个ndarray、使用函数array()
data = [1,2,3]
arr1 = np.array(data)
arr2 = np.array([[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12]])
print(f'一维数组: \n {arr1} \n\n 多维数组: \n {arr2} \n')
# 可增加参数dtype设置数据类型,如果没有指定,会自动推断
arr3 = np.array([1.1,2,3],dtype=np.float64)
print(f'数据类型为 {arr3.dtype} 的一维数组:{arr3}')
output:
# 一些常用的对象属性
print(arr2.ndim) # 秩,即轴的数量或维度的数量
print(arr2.shape) # 数组的维度,对于矩阵,n行m列
print(arr2.size) # 数组元素的总个数,相当于.shape中n*m的值
print(arr2.dtype) # ndarray对象的元素类型
output:
1.2、产生整数变量np.arange()
# 使用arange()函数
# 参数:开始位置、结束位置、步长(默认为1)
print(np.arange(15),end="\n\n")
# 等同于
print(np.array([x for x in range(15)]),end="\n\n")
print(np.arange(2,15),end="\n\n")
print(np.arange(2,15,2),end="\n\n")
print(np.arange(2,15,1.5),end="\n\n")
output:
1.3、常用矩阵
a = np.zeros((2,3)) # 以0填充
b = np.empty(10) # 数组元素为随机值(个人觉得使用少)
c = np.ones(10) # 以1填充
d = np.identity(2) # 对称矩阵
e = np.eye(3,4) # 对角矩阵
print(a,'\n\n',b,'\n\n',c,'\n\n',d,'\n\n',e)
output:
1.4、产生随机数组
np.random.normal(loc,scale,size)
正态分布随机数(均值、方差、大小)- seed,permutation,shuffle,rand,randit,randn,vinomial,normal,beta,chisquare,gamma,uniform等
arr = np.random.normal(size=(4, 4))
print(arr, '\n')
from numpy.random import randn # randn函数从标准正态分布抽取随机数
arr = randn(2, 3)
print(arr)
output:
import random
x = random.uniform(0,1) # 随机数
x
output:
2、数据选取
2.1、索引
- 简单的下标索引
arr = np.arange(10)
arr[5]
output:
- 利用布尔值索引
#from numpy.random import randn # randn函数从标准正态分布抽取随机数
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = randn(7, 4)
print(names,'\n')
print(data,'\n')
print(names == 'Bob','\n')
print(data[names == 'Bob'],'\n')
print(data[names == 'Bob', 3],'\n')
print((names == 'Bob') | (names == 'Will'),'\n')
print(data[data<0],'\n')
output:
- 其他索引
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
print(arr,'\n')
print(arr[[4, 3, 0, 6]],'\n')
print(arr[[-3, -5, -7]],'\n') #- 表示倒序
output:
arr = np.arange(32).reshape((8, 4))
print(arr,'\n')
print(arr[::-1],'\n') # start:end:step(为负则倒序)
print(arr[:,2::-1],'\n')
print(arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]],'\n')
print(arr[[1, 5, 7, 2], [0, 3, 1, 2]],'\n')
output:
2.2、切片
# ndarray 对象的切片传地址
arr = np.arange(10)
b = arr[5:8] # 表示选取index = 5、6、7
#### b = arr[5:8].copy() # 若想拷贝成新的对象(仅传递数值),则使用.copy()函数即可
b[0] = 11111
print(b,arr) # b改变的时候arr跟着改变
# 与list不同,list的切片拷贝生成新的对象
lis = [0,1,2,3,4,5,6,7,8,9]
c = lis[5:8]
c[0] = 11111
print(c,lis) # c改变了lis不随之改变
output:
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 注意区分arr2d[:][1]和arr2d[:,1]
print(arr2d[1],end='\n\n')
print(arr2d[:][1],end='\n\n')
print(arr2d[:,1],end='\n\n')
print(arr2d[:,0:2],end='\n\n')
print(arr2d[:,[0,1]],end='\n\n')
print(arr2d[0][2],end='\n\n')
print(arr2d[0,2],end='\n\n')
print(arr2d[0:2,0:2],end='\n\n')
b = arr2d[0]
b[:] = 10 # 二维数组切片也传地址
arr2d
output:
3、数据处理
3.1、改变数组维度arr.reshape()
# reshape()函数
arr = np.array([[1,2],
[3,4],
[5,6]])
arr.reshape(1,6).reshape(2,3)
output:
3.2、转换数组元素数据类型arr.astype()
# 整数转换为浮点
arr = np.array([1,2,3])
arr.astype(np.float64)
output:
# 浮点转换为整数、浮点转换为字符串
arr = np.array([1.1,2.2,3.3])
arr.astype(np.int32),arr.astype(np.str)
output:
3.3、数组转置arr.T
arr = np.array([[1,2,3],
[4,5,6]])
arr.T
output:
3.4、矩阵相乘np.dot()
- diag,dot,trace,det,eig,inv,pinv,qr,svd,solve,lstsq函数等
- numpy.linalg中有更多矩阵函数
arr = np.arange(15).reshape((3, 5))
np.dot(arr.T,arr) # (5×3) * (3×5) 向量点积和
output:
4、数据运算
4.1、加减乘除基本运算
- 数组的
+
,-
,*
,/
为对应位置的点对点运算
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
print(arr + arr,end='\n\n')
print(arr - arr,end='\n\n')
print(arr * arr,end='\n\n')
print( 1 / arr,end='\n\n')
print(arr **0.5,end='\n\n') # 幂运算
output:
4.2、常用数学运算
np.sqrt()
求根号np.exp()
求指数函数值np.maximum()
两数组比较输出对应位置较大的值np.minimum()
两数组比较输出对应位置较小的值np.modf()
对浮点数数组得到整数和小数部分两个数组np.meshgrid()
使用数组值生成网格/坐标矩阵- 还有argmin,argmax,cumsum,cumprod等
arr = np.arange(10)
print(arr,'\n')
print(np.sqrt(arr)) # 根号函数
print(np.exp(arr)) # 指数函数
output:
# from numpy.random import randn # randn函数从标准正态分布抽取随机数
x = randn(8)
y = randn(8)
print('x', x)
print('y', y,'\n')
print('max', np.maximum(x, y)) # 对x,y对应位置取最大值得到新的数组
print('min', np.minimum(x, y), '\n') # 对x,y对应位置取最小值得到新的数组
print(np.modf(x),'\n') # 返回x的整数部分与小数部分
output:
points = np.arange(-5, 5, 1) # 10
p = np.arange(-4, 4, 1) # 8
[x1, y1] = np.meshgrid(points,points) #meshgrid生成网格 10*10
[x2, y2] = np.meshgrid(points,p) # 8*10
print(points,'\n', x1,'\n', y1, '\n\n')# 坐标矩阵
print(x2,'\n', y2)
output:
4.4、常用统计运算
np.sum()
求和np.mean()
求平均值np.std()
求标准差np.var()
求方差np.cov()
求协方差np.max()
求最大值np.min()
求最小值
# from numpy.random import randn # randn函数从标准正态分布抽取随机数
arr = randn(4,3)
print(f'二维数组:\n{arr}')
summ = np.sum(arr)
maxx = np.max(arr)
minn = np.min(arr)
print(f'arr求和:{summ}')
print(f'arr最大值:{maxx}')
print(f'arr最小值:{minn}')
# 计算【每列】数据的样本均值,标准差,方差,各列之间的协方差
# 求每行数据的话,直接默认参数即可
average = np.mean(arr, axis = 0) # 样本均值
std = np.std(arr, axis = 0)
w_var = np.var(arr, axis = 0) # 总体方差
var = np.var(arr, axis = 0, ddof = 1) # 样本方差 (ddof = 1)
cov = np.cov(arr, rowvar=False) # 各列之间的协方差 (rowvar=False)
print(f'样本均值:\n{average}')
print(f'样本标准差:\n{std}')
print(f'总体方差:\n{w_var}')
print(f'样本方差:\n{var}')
print(f'各列之间的协方差:\n{cov}')
output:
其他
-
取二维数组某一列
arr[:,0]
-
在某一数组后拼接数组
arr1.append(arr2)
或np.append(arr1,arr2)
-
判断两个数组是否完全相等
(arr1 == arr2).all()
-
判断两个数组是否存在相同元素
(arr1 == arr2).any()
-
只复制数组数值,不传递地址
x = y.copy()
或x[:] = y[:]
-
将多位整数切分成ndarray数组
a = 435748141
b = np.array(list(map(int,str(a)))
-
判断一个变量是否是list类型
isindtance(a, int)
-
对数组按列排序
arr.sort(0)
-
输出数组中不同的元素
np.unique(arr)
-
条件判断语句
np.where(cond, xarr, yarr)
# if cond return xarr else return yarr