Python基础与科学计算常用方法

本文使用的是Jupyter Notebook,Python3。你可以将代码直接复制到Jupyter Notebook中运行,以便更好的学习。

导入所需要的头文件

import numpy as np

import numpy as np

import matplotlib as mpl

from mpl_toolkits.mplot3d import Axes3D

from matplotlib import cm

import time

from scipy.optimize import leastsq

from scipy import stats

import scipy.optimize as opt

import matplotlib.pyplot as plt

from scipy.stats import norm, poisson

import math

import scipy

from scipy.interpolate import BarycentricInterpolator

from scipy.interpolate import CubicSpline

a = np.arange(0, 60, 10).reshape((-1, 1)) + np.arange(6)

print (a)

1.使用array创建

标准Python的列表(list)中,元素本质是对象。

如:L = [1, 2, 3],需要3个指针和三个整数对象,对于数值运算比较浪费内存和CPU。

因此,Numpy提供了ndarray(N-dimensional array object)对象:存储单一数据类型的多维数组。

# 通过array函数传递list对象

L = [1, 2, 3, 4, 5, 6]

print ("L = ", L)

a = np.array(L) # 数组没有逗号

print ("a = ", a)

print (type(a), type(L))

# 若传递的是多层嵌套的list,将创建多维数组

b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

print (b)

# 数组大小可以通过其shape属性获得

print (a.shape)

print (b.shape)

# # 也可以强制修改shape

b.shape = 4, 3

print (b)

# 注:从(3,4)改为(4,3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变

# 当某个轴为-1时,将根据数组元素的个数自动计算此轴的长度

b.shape = 2, -1

print (b)

print (b.shape)

b.shape = 3, 4

print (b)

# 使用reshape方法,可以创建改变了尺寸的新数组,原数组的shape保持不变

c = b.reshape((4, -1))

print ("b = \n", b)

print ('c = \n', c)

# 数组b和c共享内存,修改任意一个将影响另外一个

b[0][1] = 20

print ("b = \n", b)

print ("c = \n", c)

# 数组的元素类型可以通过dtype属性获得

print (a.dtype)

print (b.dtype)

# 可以通过dtype参数在创建时指定元素类型

d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype=np.float)

f = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype=np.complex)

print (d)

print (f)

# 如果更改元素类型,可以使用astype安全的转换

f = d.astype(np.int)

print (f)

# 但不要强制仅修改元素类型,如下面这句,将会以int来解释单精度float类型

d.dtype = np.int

print (d)

2.使用函数创建

如果生成一定规则的数据,可以使用NumPy提供的专门函数

arange函数类似于python的range函数:指定起始值、终止值和步长来创建数组,和Python的range类似,arange同样不包括终值;但arange可以生成浮点类型,而range只能是整数类型

a = np.arange(1, 10, 0.5)

print (a)

# linspace函数通过指定起始值、终止值和元素个数来创建数组,缺省包括终止值

b = np.linspace(1, 10, 10)

print ('b = ', b)

# 可以通过endpoint关键字指定是否包括终值

c = np.linspace(1, 10, 10, endpoint=False)

print ('c = ', c)

# 和linspace类似,logspace可以创建等比数列

# 下面函数创建起始值为10^1,终止值为10^2,有10个数的等比数列

d = np.logspace(1, 2, 9, endpoint=True)

print (d)

# 下面创建起始值为2^0,终止值为2^10(包括),有10个数的等比数列

f = np.logspace(0, 10, 10, endpoint=True, base=2)

print (f)

# 使用 frombuffer, fromstring, fromfile等函数可以从字节序列创建数组

s = 'abcdz'

g = np.fromstring(s, dtype=np.int8) # 复制对应的ASII码

print (g)

3.存取

3.1常规方法

# 数组元素的存取方法和Python的标准方法相同

a = np.arange(10)

print (a)

# 获取某个元素

print (a[3])

# 切片[3,6),左闭右开

print (a[3:6])

# 省略开始下标,表示从0开始

print (a[:5])

# 下标为负表示从后向前数

print (a[3:])

# 步长为2

print (a[1:9:2])

# 步长为-1,即翻转

print (a[::-1])

# 切片数据是原数组的一个视图,与原数组共享内容空间,可以直接修改元素值

a[1:4] = 10, 20, 30

print (a)

# 因此,在实践中,切实注意原始数据是否被破坏,如:

b = a[2:5]

b[0] = 200

print (a)

3.2 整数/布尔数组存取

3.2.1

# 根据整数数组存取:当使用整数序列对数组元素进行存取时,

# 将使用整数序列中的每个元素作为下标,整数序列可以是列表(list)或者数组(ndarray)。

# 使用整数序列作为下标获得的数组不和原始数组共享数据空间。

a = np.logspace(0, 9, 10, base=2)

print (a)

i = np.arange(0, 10, 2)

print (i)

# 利用i取a中的元素

b = a[i]

print (b)

# b的元素更改,a中元素不受影响

b[2] = 1.6

print (b)

print (a)

3.2.2

# 使用布尔数组i作为下标存取数组a中的元素:返回数组a中所有在数组b中对应下标为True的元素

# 生成10个满足[0,1)中均匀分布的随机数

a = np.random.rand(10)

print (a)

# 大于0.5的元素索引

print (a > 0.5)

# 大于0.5的元素

b = a[a > 0.5]

print (b)

# 将原数组中大于0.5的元素截取成0.5

a[a > 0.5] = 0.5

print (a)

# # # b不受影响

print (b)

3.3 二维数组的切片

a = np.arange(0, 60, 10) # 行向量

print ('a = ', a)

b = a.reshape((-1, 1)) # 转换成列向量

print (b)

c = np.arange(6)

print (c)

f = b + c # 行 + 列

print (f)

# 合并上述代码:

a = np.arange(0, 60, 10).reshape((-1, 1)) + np.arange(6)

print (a)

# 二维数组的切片

print (a[[0, 1, 2], [2, 3, 4]])

print (a[4, [2, 3, 4]])

print (a[4:, [2, 3, 4]])

i = np.array([True, False, True, False, False, True])

print (a[i])

print (a[i, 3])

4.1 numpy与Python数学库的时间比较

for j in np.logspace(0, 7, 10):

j = int(j)

x = np.linspace(0, 10, j)

start = time.clock()

y = np.sin(x)

t1 = time.clock() - start

x = x.tolist()

start = time.clock()

for i, t in enumerate(x):

x[i] = math.sin(t)

t2 = time.clock() - start

print (j, ": ", t1, t2, t2/t1)

# 4.2 元素去重

4.2.1直接使用库函数

a = np.array((1, 2, 3, 4, 5, 5, 7, 3, 2, 2, 8, 8))

print ('原始数组:', a)

# 使用库函数unique

b = np.unique(a)

print ('去重后:', b)

4.2.2 二维数组的去重,结果会是预期的么?

c = np.array(((1, 2), (3, 4), (5, 6), (1, 3), (3, 4), (7, 6)))

print (u'二维数组:\n', c)

print ('去重后:', np.unique(c))

4.2.3 方案1:转换为虚数

# r, i = np.split(c, (1, ), axis=1)

# x = r + i * 1j

x = c[:, 0] + c[:, 1] * 1j

print ('转换成虚数:', x)

print ('虚数去重后:', np.unique(x))

print (np.unique(x, return_index=True)) # 思考return_index的意义

idx = np.unique(x, return_index=True)[1]

print ('二维数组去重:\n', c[idx])

4.2.3 方案2:利用set

print ('去重方案2:\n', np.array(list(set([tuple(t) for t in c]))))

4.3 stack and axis

a = np.arange(1, 10).reshape((3, 3))

b = np.arange(11, 20).reshape((3, 3))

c = np.arange(101, 110).reshape((3, 3))

print ('a = \n', a)

print ('b = \n', b)

print ('c = \n', c)

print ('axis = 0 \n', np.stack((a, b, c), axis=0))

print ('axis = 1 \n', np.stack((a, b, c), axis=1))

print ('axis = 2 \n', np.stack((a, b, c), axis=2))

a = np.arange(1, 10).reshape(3,3)

print (a)

b = a + 10

print (b)

print (np.dot(a, b)) # dot 正常的矩阵乘法

print (a * b) # * 对应元素的相乘

a = np.arange(1, 10)

print (a)

b = np.arange(20,25)

print (b)

print (np.concatenate((a, b)))

5.绘图

5.1 绘制正态分布概率密度函数

# 自定义字体使中文正常显示

mpl.rcParams['font.sans-serif'] = [u'SimHei'] #FangSong/黑体 FangSong/KaiTi

mpl.rcParams['axes.unicode_minus'] = False

mu = 0

sigma = 1

x = np.linspace(mu - 3 * sigma, mu + 3 * sigma, 51)

y = np.exp(-(x - mu) ** 2 / (2 * sigma ** 2)) / (math.sqrt(2 * math.pi) * sigma)

print (x.shape)

print ('x = \n', x)

print (y.shape)

print ('y = \n', y)

plt.figure(facecolor='w') # 背景色设置为白色

# plt.plot(x, y, 'ro-', linewidth=2)

plt.plot(x, y, 'r-', x, y, 'go', linewidth=2, markersize=8)

plt.xlabel('X', fontsize=15)

plt.ylabel('Y', fontsize=15)

plt.title(u'高斯分布函数', fontsize=18)

plt.grid(True)

plt.show()

5.2 损失函数

# Logistic损失(-1,1)/SVM Hinge损失/ 0/1损失

plt.figure(figsize=(10,8),dpi=100) # 指定图像尺寸和dpi

x = np.array(np.linspace(start=-2, stop=3, num=1001, dtype=np.float))

y_logit = np.log(1 + np.exp(-x)) / math.log(2)

y_boost = np.exp(-x)

y_01 = x < 0

y_hinge = 1.0 - x

y_hinge[y_hinge < 0] = 0

plt.plot(x, y_logit, 'r-', label='Logistic Loss', linewidth=2)

plt.plot(x, y_01, 'g-', label='0/1 Loss', linewidth=2)

plt.plot(x, y_hinge, 'b-', label='Hinge Loss', linewidth=2)

plt.plot(x, y_boost, 'm--', label='Adaboost Loss', linewidth=2)

plt.grid() # 画格子出来

plt.legend(loc='upper right') # 图例显示位置

plt.savefig('1.png')

plt.show()

5.3 x^x

def f(x):

y = np.ones_like(x)

i = x > 0

y[i] = np.power(x[i], x[i])

i = x < 0

y[i] = np.power(-x[i], -x[i])

return y

x = np.linspace(-1.3, 1.3, 101)

y = f(x)

plt.plot(x, y, 'g-', label='x^x', linewidth=2)

plt.grid()

plt.legend(loc='upper left')

plt.show()

5.4 胸型线

x = np.arange(1, 0, -0.001)

y = (-3 * x * np.log(x) + np.exp(-(40 * (x - 1 / np.e)) ** 4) / 25) / 2

plt.figure(figsize=(5,7), facecolor='w')

plt.plot(y, x, 'r-', linewidth=2)

plt.grid(True)

plt.title(u'胸型线', fontsize=20)

# plt.savefig('breast.png')

plt.show()

5.5 心形线

t = np.linspace(0, 2*np.pi, 100)

x = 16 * np.sin(t) ** 3

y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)

plt.plot(x, y, 'r-', linewidth=2)

plt.grid(True)

plt.show()

5.6 渐开线

t = np.linspace(0, 50, num=1000)

x = t*np.sin(t) + np.cos(t)

y = np.sin(t) - t*np.cos(t)

plt.plot(x, y, 'r-', linewidth=2)

plt.grid()

plt.show()

5.7Bar

x = np.arange(0, 10, 0.1)

y = np.sin(x)

plt.bar(x, y, width=0.04, linewidth=0.2)

plt.plot(x, y, 'r--', linewidth=2)

plt.title(u'Sin曲线')

plt.xticks(rotation=-60)

plt.xlabel('X')

plt.ylabel('Y')

plt.grid()

plt.show()

6. 概率分布

6.1 均匀分布

x = np.random.rand(10000)

t = np.arange(len(x))

# plt.hist(x, 30, color='#000000', alpha=0.5, label=u'均匀分布') # alpha透明度

plt.plot(t, x, 'g.', label=u'均匀分布') # .小点, o 圈, - 线

plt.legend(loc='upper left')

plt.grid()

plt.show()

6.2 验证中心极限定理

t = 1000

a = np.zeros(10000)

for i in range(t):

a += np.random.uniform(-5, 5, 10000)

a /= t

plt.hist(a, bins=30, color='g', alpha=0.5, normed=True, label=u'均匀分布叠加')

plt.legend(loc='upper left')

plt.grid()

plt.show()

# 6.21 其他分布的中心极限定理

lamda = 10

p = stats.poisson(lamda)

y = p.rvs(size=1000)

mx = 30

r = (0, mx)

bins = r[1] - r[0]

plt.figure(figsize=(10, 8), facecolor='w')

plt.subplot(121)

plt.hist(y, bins=bins, range=r, color='g', alpha=0.8, normed=True)

t = np.arange(0, mx+1)

plt.plot(t, p.pmf(t), 'ro-', lw=2)

plt.grid(True)

N = 1000

M = 10000

plt.subplot(122)

a = np.zeros(M, dtype=np.float)

p = stats.poisson(lamda)

for i in np.arange(N):

y = p.rvs(size=M)

a += y

a /= N

plt.hist(a, bins=20, color='g', alpha=0.8, normed=True)

plt.grid(b=True)

plt.show()

6.3 Poisson分布

x = np.random.poisson(lam=5, size=10000)

print (x)

pillar = 15

a = plt.hist(x, bins=pillar, normed=True, range=[0, pillar], color='g', alpha=0.5)

plt.grid()

# plt.show()

print (a)

print (a[0].sum())

6.4 直方图的使用

mu = 2

sigma = 3

data = mu + sigma * np.random.randn(1000)

h = plt.hist(data, 30, normed=1, color='#a0a0ff')

x = h[1]

y = norm.pdf(x, loc=mu, scale=sigma)

plt.plot(x, y, 'r--', x, y, 'ro', linewidth=2, markersize=4)

plt.grid()

plt.show()

6.5 插值

rv = poisson(5)

x1 = a[1]

y1 = rv.pmf(x1)

itp = BarycentricInterpolator(x1, y1) # 重心插值

x2 = np.linspace(x.min(), x.max(), 50)

y2 = itp(x2)

cs = scipy.interpolate.CubicSpline(x1, y1) # 三次样条插值

plt.plot(x2, cs(x2), 'm--', linewidth=5, label='CubicSpine') # 三次样条插值

plt.plot(x2, y2, 'g-', linewidth=3, label='BarycentricInterpolator') # 重心插值

plt.plot(x1, y1, 'r-', linewidth=1, label='Actural Value') # 原始值

plt.legend(loc='upper right')

plt.grid()

plt.show()

7. 绘制三维图像

# x, y = np.ogrid[-3:3:100j, -3:3:100j]

# print(x,y)

u = np.linspace(-3, 3, 101)

x, y = np.meshgrid(u, u)

z = x*y*np.exp(-(x**2 + y**2)/2) / math.sqrt(2*math.pi)

# z = x*y*np.exp(-(x**2 + y**2)/2) / math.sqrt(2*math.pi)

fig = plt.figure()

ax = fig.add_subplot(111, projection='3d')

# ax.plot_surface(x, y, z, rstride=5, cstride=5, cmap=cm.coolwarm, linewidth=0.1) #

ax.plot_surface(x, y, z, rstride=5, cstride=5, cmap=cm.Accent, linewidth=0.5)

plt.show()

# cmaps = [('Perceptually Uniform Sequential',

# ['viridis', 'inferno', 'plasma', 'magma']),

# ('Sequential', ['Blues', 'BuGn', 'BuPu',

# 'GnBu', 'Greens', 'Greys', 'Oranges', 'OrRd',

# 'PuBu', 'PuBuGn', 'PuRd', 'Purples', 'RdPu',

# 'Reds', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd']),

# ('Sequential (2)', ['afmhot', 'autumn', 'bone', 'cool',

# 'copper', 'gist_heat', 'gray', 'hot',

# 'pink', 'spring', 'summer', 'winter']),

# ('Diverging', ['BrBG', 'bwr', 'coolwarm', 'PiYG', 'PRGn', 'PuOr',

# 'RdBu', 'RdGy', 'RdYlBu', 'RdYlGn', 'Spectral',

# 'seismic']),

# ('Qualitative', ['Accent', 'Dark2', 'Paired', 'Pastel1',

# 'Pastel2', 'Set1', 'Set2', 'Set3']),

# ('Miscellaneous', ['gist_earth', 'terrain', 'ocean', 'gist_stern',

# 'brg', 'CMRmap', 'cubehelix',

# 'gnuplot', 'gnuplot2', 'gist_ncar',

# 'nipy_spectral', 'jet', 'rainbow',

# 'gist_rainbow', 'hsv', 'flag', 'prism'])]

欢迎关注我的公众号,新手入门资料。

wechat.jpg

自学python编程基础科学计算_Python基础与科学计算常用方法相关推荐

  1. 自学python 编程基础科学计算及数据分析 pdf_自学Python:编程基础、科学计算及数据分析...

    目录 前言 致谢 第1章 初识Python1 1.1 Python简介1 1.2 Python版本的选择2 1.3 Python集成开发环境的搭建2 1.4 第一行Python代码4 1.5 IPyt ...

  2. python怎样算入门_Python基础练习之计算提成

    在刚刚发布的2018年10月TIOBE编程语言排行榜中,Python位居四位,但与排名第三的C++只有0.44%的微弱差距,由此也可见Python的受欢迎程度.眼看人工智能时代到来,Python作为主 ...

  3. python用户输入算式并计算_Python基础学习之计算和算式

    今天小编要跟大家分享的文章是关于Python基础学习之计算和算式.正在学习Python相关知识的小伙伴们来和小编一起看一看吧,希望能够对大家有所帮助! Python 具有执行计算的能力. 直接在 Py ...

  4. python编程字典数据库_python基础数据类型之字典、集合

    哈啰!大家好,今天是初五了,牛年接财神的好日子,懂得都懂.祝@所有人2021年,事事顺利,牛气冲天,福利满满,财运亨通,步步高升,学业进步! 那么,这次介绍的是鼎鼎大名的字典,其以其操作的灵活性.操作 ...

  5. python常用序列类型_Python基础-序列类型的常用方法

    python 是一门编程语言,是一门完全面向对象的编程语言. 各序列类型的自带方法 序列的常用方法 元组的常用方法 字符串的常用方法 ①列表的常用方法 L.append(obj) >>&g ...

  6. python 科学计算基础教程电子版-自学Python 编程基础、科学计算及数据分析

    自学Python 编程基础.科学计算及数据分析 epub pdf mobi txt 下载 自学Python 编程基础.科学计算及数据分析 epub pdf mobi txt 下载 ☆☆☆☆☆ 李金 著 ...

  7. python编程入门与案例详解-自学Python 编程基础、科学计算及数据分析

    自学Python 编程基础.科学计算及数据分析 epub pdf mobi txt 下载 自学Python 编程基础.科学计算及数据分析 epub pdf mobi txt 下载 ☆☆☆☆☆ 李金 著 ...

  8. 零基础新手自学Python编程教程入门精通学习资料网站大全

    零基础新手自学Python编程教程入门精通学习资料网站大全 今天说下关于Python的一些普及知识,以及学习资料,这一节我来跟大家分享下. 1 为什么要学习Python? 1 Python是一个脚本语 ...

  9. 零基础如何系统地自学Python编程?这是我看到过回答最好的文章

    零基础如何系统地自学Python编程?最近柏汌的一个粉丝私信我这么问道,我思考了一下谨慎的回答了他,但是感觉很多东西还是没说明白,相信其他朋友也会有这样的困惑,所以今天就好好的跟大家聊一下这个问题. ...

最新文章

  1. .NET混淆器 Dotfuscator使用教程七:加强保护之改进重命名混淆
  2. CentOS 7安装Keepalived
  3. 【APUE】Chapter17 Advanced IPC sign extension 结构体内存对齐
  4. 升腾联手VMware 发布首款本土化桌面虚拟化
  5. D3DCOLOR与D3DXCOLOR
  6. 通过javascript实现的轻量级模态框解决方案(支持Ajax)
  7. php 64位编码解码,php base64 编码和解码
  8. 100亿估值的文和友,为何难以“走出”长沙?
  9. R语言ggplot2移除图例_读书笔记:R语言绘图—ggplot2
  10. Java 常用对象-StringBuffer类
  11. python搭建环境教程_python教程(一)·python环境搭建
  12. ssh放行端口_安全组中已经添加规则放行SSH端口的访问之后使用f1 RTL的方法
  13. 网络营销:信任是流量时代的蓝海
  14. 大泥王怎么调时区_卡西欧大泥王功能教学及怎么调时间
  15. The NPF driver isn't running. You may have trouble capturing or listing interfaces
  16. Mac电脑下好用的mac版远程控制远程桌面软件
  17. 接口管理系统 eoLinker-AMS 开源版 V3.5.0 发布更新
  18. 支付宝小程序生态服务商奖励发布,单个商家最高奖励5000元
  19. 中国IT从业者的职业——计算机程序设计员
  20. linux用户解锁pam_tally,多次登录失败用户被锁定及使用Pam_Tally2解锁

热门文章

  1. Windows终止进程
  2. Bmp格式与编程读取解析
  3. 【剑指offer】面试题27:二叉树的镜像(Java)
  4. 【剑指offer】面试题58 - I:翻转单词顺序(Java)
  5. python十个运维实战项目_干货 | 这4个Python实战项目,让你瞬间读懂Python!
  6. labelme标注文件转coco json,coco json转yolo txt格式,coco json转xml, labelme标注文件转分割,boxes转labelme json
  7. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 20丨查询结果的质量和占比【难度简单】​
  8. linux python 永久添加自己的模块路径
  9. CompletableFuture详解~思维导图
  10. C++学习之路 | PTA乙级—— 1091 N-自守数 (15 分)(精简)