NumPy Study Notes
❤️ Download
author : zoxiii
NumPy的前身为 Numeric,最早由Jim Hugunin与其它协作者共同开发,2005年,Travis Oliphant在Numeric中结合了另一个同性质的程序 Numarray的特色,并加入了其它扩展而开发了NumPy。
Numerical Python 的简称,是Python科学计算的基础包,支持大量的维度数组与矩阵运算
NumPy官网
NumPy菜鸟教程
set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None)
常用参数:
import numpy as np # 导入包
np.set_printoptions(precision=4, suppress=True) # 设置NumPy对象的显示格式
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
np.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}')
# 一些常用的对象属性
print(arr2.ndim) # 秩,即轴的数量或维度的数量
print(arr2.shape) # 数组的维度,对于矩阵,n行m列
print(arr2.size) # 数组元素的总个数,相当于.shape中n*m的值
print(arr2.dtype) # ndarray对象的元素类型
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")
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)
np.random.normal(loc,scale,size)
正态分布随机数(均值、方差、大小)arr = np.random.normal(size=(4, 4))
print(arr, '\n')
from numpy.random import randn # randn函数从标准正态分布抽取随机数
arr = randn(2, 3)
print(arr)
import random
x = random.uniform(0,1) # 随机数
x
output:
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')
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') #- 表示倒序
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')
# 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不随之改变
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
arr.reshape()
# reshape()函数
arr = np.array([[1,2],
[3,4],
[5,6]])
arr.reshape(1,6).reshape(2,3)
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:
arr.T
arr = np.array([[1,2,3],
[4,5,6]])
arr.T
np.dot()
arr = np.arange(15).reshape((3, 5))
np.dot(arr.T,arr) # (5×3) * (3×5) 向量点积和
+
,-
,*
,/
为对应位置的点对点运算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') # 幂运算
np.sqrt()
求根号np.exp()
求指数函数值np.maximum()
两数组比较输出对应位置较大的值np.minimum()
两数组比较输出对应位置较小的值np.modf()
对浮点数数组得到整数和小数部分两个数组np.meshgrid()
使用数组值生成网格/坐标矩阵arr = np.arange(10)
print(arr,'\n')
print(np.sqrt(arr)) # 根号函数
print(np.exp(arr)) # 指数函数
# 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的整数部分与小数部分
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)
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}')
取二维数组某一列 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