Python NumPy学习笔记


NumPy Study Notes
❤️ Download
author : zoxiii


0、NumPy简介

  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)

常用参数:

  • 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”的集合。

  1. 以下标0开始;

  2. ndarray 中的每个元素在内存中都有相同存储大小的区域;

  3. numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算。

  4. Numpy底层使用C语言编写,数组中直接存储对象,而不是存储对象指针,所以其运算效率远高于纯Python代码。

  5. 数组维度(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、索引

  1. 简单的下标索引
arr = np.arange(10)
arr[5]

output:
在这里插入图片描述

  1. 利用布尔值索引
#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:
在这里插入图片描述

  1. 其他索引
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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zoxiii

越打赏越生长

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值