Python科学计算之生成数据

文章目录

Python科学计算系列:数组

正所谓巧妇难为无米之炊,没有数据,也就没法对数据进行分析,从而数值计算也就成了无根之木了。所以,在学习具体的数值计算方法之前,先介绍几种特殊数据的生成方法。

生成序列

在科学计算时,会经常遇到生成序列的需求,比如前面演示差分、累加时就通过arange生成了一组自然数列。并且为了让相邻元素间隔 0.1 0.1 0.1,还在后面除以10。然而,arange这个函数,其实是有能力生成间隔为0.1的序列的。

此外,【linspace】也可以生成等差数列,二者区别如下

  • linspace(a,b,N) 在 [ a , b ] [a,b] [a,b]中间生成 N N N个值, N N N默认为50
  • arange(a,b,delta) 在 [ a , b ) [a,b) [a,b)之间,以 δ \delta δ为间隔生成值, δ \delta δ默认为1

所以,若想实现 [ 0 , 10 ) [0,10) [0,10)之间间隔为0.1的等差数列,这两个函数都可以做到,但需注意,linspace函数对两个端点默认是封闭的。

python 复制代码
x = np.arange(0,10,0.1)
x = np.linspace(0,9.9,100)
x = np.linspace(0,10,100,endpoint=False)

除了等差数列之外,【logspace】和【geomspace】函数,可生成等比数列,二者区别如下

  • logspace(a,b,N,base=c) 在 [ c a , c b ] [c^a, c^b] [ca,cb] 之间等比生成N个值
  • geomspace(a,b,N,base=c) 在 [ a , b ] [a,b] [a,b]之间,等比生成N个值

base参数可表示对数的底。取 a = 1 , b = 2 , N = 20 a=1, b=2, N=20 a=1,b=2,N=20,二者差别如下

绘图代码为

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(1,2,20)
y = {"logspace" : np.logspace(1,2,20),
"geomspace" : np.geomspace(1,2,20)}

fig = plt.figure()
for i,key in zip([1,2],y.keys()):
    ax = fig.add_subplot(1,2,i)
    ax.plot(x,y[key],marker="*")
    ax.set_title(key)

plt.show()

创建网格

在三维图的绘制过程中,一般需要 x , y , z x,y,z x,y,z之间的对应关系,但对于图像而言,其 x , y x,y x,y轴坐标是体现在像素栅格中的,从而图像矩阵中的像素强度,其实表示的是 z z z轴的坐标,这种情况下如果想绘制三维散点图,就需要生成图像像素对应的坐标网格。

这种网格形式大致如下,其中 x v x_v xv的 y y y轴不变,而 x x x轴等差增长,与坐标轴等比例映射, y v y_v yv同理。

x v = [ 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 ] y v = [ 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 ] x_v=\begin{bmatrix} 1&2&3&4\\1&2&3&4\\1&2&3&4\\1&2&3&4\\ \end{bmatrix}\quad y_v=\begin{bmatrix} 0&0&0&0\\1&1&1&1\\2&2&2&2\\3&3&3&3\\ \end{bmatrix} xv= 1111222233334444 yv= 0123012301230123

【meshgrid】是Python中最常用的坐标网格生成函数,可将输入的 x , y x,y x,y变量,向 y y y轴和 x x x轴方向进行扩张。如想生成 x v , y v x_v, y_v xv,yv,方法如下

python 复制代码
x = [1,2,3,4]
y = [0,1,2,3]
xv, yv = np.meshgrid(x, y)

【mgrid】比meshgrid更加简单,可以直接通过魔法函数用索引语法来生成坐标网格,

python 复制代码
yv, xv = np.mgrid[:4, 1:5]

np.mgrid[1:5]       # [1, 2, 3, 4]
np.mgrid[1:10:5]    # [1, 6]
np.mgrid[1.1:10]    # [1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1]

如果翻阅源码,会发现mgrid是MGridClass的一个实例,MGridClass则是nd_grid的一个子类,在nd_grid中,实现了__getitem__这个魔法函数,从而支持方括号语法来生成数据。。

【ogrid】的用法与mgrid相同,同样是nd_grid的子类,但生成的数组不同,直接看案例

python 复制代码
x,y = ogrid[0:5,0:5]

其中, x = [ 0 , 1 , 2 , 3 , 4 ] T x=[0,1,2,3,4]^T x=[0,1,2,3,4]T, y = [ 0 , 1 , 2 , 3 , 4 ] y=[0,1,2,3,4] y=[0,1,2,3,4]。

如果想干脆一点,只是生成从0开始的等间隔的坐标网格,那么这里最推荐的是【indices】,这个函数只需输入维度,就可以完成网格的创建。

创建特殊数组

numpy提供了一系列函数用以生成特殊数组,列表如下。所有这些函数中,都有一个可选参数dtype,表示创建的数组的数据类型。

类别 函数
指定维度 empty, ones, zeros, full, eye, identity
模仿维度 empty_like, ones_like, zeros_like, full_like
特殊矩阵 diag, diagflat, tri, tril, triu, vander

【empty】生成指定维度的空数组。

【ones】, 【zeros】和【full】生成所有元素都相同的数组,顾名思义,前两者分别是全1和全0的数组,而full可通过参数fill_value来指定填充的数值。

以【_like】为后缀的函数,表示生成一个和输入数组维度相同的数组,例如,np.ones_like(x)等价于np.ones(x.shape)

python 复制代码
np.ones(3)              #生成全1的3x1数组
np.zeros([2,3])         #生成全0的2x3数组
x = np.full([2,4], 5)   #生成元素均为5的2x4数组
y = np.full_like(x, 6)

【eye】和【identity】都是生成对角为1,其他元素为0的矩阵,区别在于,前者只能生成单位矩阵,即方阵;后者则无此要求。【diagflat】和【diag】用于生成对角矩阵,这几种矩阵的区别如下。

【diag】在diagflat基础上,还可以提取对角元素,例如

python 复制代码
np.diag(np.ones([3,3])) #提取对角元素 [1., 1., 1.]

【tri(M,N,k)】用于生成M行N列的三角阵,其元素为0或者1,k用于调节$0和 1 1 1的分界线相对于对角线的位置,下图中,红色表示 1 1 1,蓝色表示 0 0 0.

【tril, triu】可用于提取出矩阵的左下和右上的三角阵,其输入参数除了待提取矩阵之外,另一个参数与tri中的k相同,把x设为

python 复制代码
x = np.arange(20).reshape(4, 5)

triltriu作用在x上的效果分别如下,二者分别把右上角和左下角的值变成了0。

【vander】可通过给定的 α i \alpha_i αi生成范德蒙德矩阵。对于 m × ( n + 1 ) m\times(n+1) m×(n+1)的范德蒙德矩阵 V V V,其矩阵元可表示为对可表示为 V i j = α i j V_{ij}=\alpha_i^j Vij=αij,示例如下

python 复制代码
x = np.array([1, 2, 3, 5])
V = np.vander(x, increasing=True)

其结果为

V = [ 1 1 1 1 1 2 4 8 1 3 6 9 1 5 25 125 ] V=\begin{bmatrix} 1&1&1&1\\1&2&4&8\\1&3&6&9\\1&5&25&125 \end{bmatrix} V= 1111123514625189125

随机数组

numpy中提供了【random】模块,可用于随机数组的生成,其中又以【rand】函数最为常用,其使用频次仅次于arange。

一个更加规范的随机数创建过程,往往需要指定随机数种子,以便于复现。

python 复制代码
np.random.seed(42)
np.random.rand(2,2)

其返回值如下。

[ 0.37454012 0.95071431 0.73199394 0.59865848 ] \begin{bmatrix} 0.37454012&0.95071431\\ 0.73199394&0.59865848 \end{bmatrix} [0.374540120.731993940.950714310.59865848]

众所周知,我们所调用的随机数,其实是伪随机数,本质是查阅随机数表。而【seed】函数,可以理解为查阅这个表的起始位置,所以这个数指定了,那么后期所有的"随机数"的值也就确定了。

除了numpy之外,Python标准库【random】也提供了随机数表,即可用于随机数的生成,但其输出仅为浮点数,示例如下

python 复制代码
import random
random.seed(42)
random.random()
# 0.6394267984578837
相关推荐
Guofu_Liao1 小时前
大语言模型---LoRA简介;LoRA的优势;LoRA训练步骤;总结
人工智能·语言模型·自然语言处理·矩阵·llama
小二·1 小时前
java基础面试题笔记(基础篇)
java·笔记·python
小喵要摸鱼3 小时前
Python 神经网络项目常用语法
python
一念之坤4 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
wxl7812275 小时前
如何使用本地大模型做数据分析
python·数据挖掘·数据分析·代码解释器
NoneCoder5 小时前
Python入门(12)--数据处理
开发语言·python
LKID体5 小时前
Python操作neo4j库py2neo使用(一)
python·oracle·neo4j
小尤笔记6 小时前
利用Python编写简单登录系统
开发语言·python·数据分析·python基础
FreedomLeo16 小时前
Python数据分析NumPy和pandas(四十、Python 中的建模库statsmodels 和 scikit-learn)
python·机器学习·数据分析·scikit-learn·statsmodels·numpy和pandas
007php0076 小时前
GoZero 上传文件File到阿里云 OSS 报错及优化方案
服务器·开发语言·数据库·python·阿里云·架构·golang