科学计算中那些眼花缭乱的Python

这篇具有很好参考价值的文章主要介绍了科学计算中那些眼花缭乱的Python。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 我们将使用Python实现一个数值计算方面的令你眼花缭乱的炫技案例。
    • 这活有意思,但是呢,嗯。。。其实我觉得也不一定有用
  • 其次,真搞科学计算,还得看Fortran,Python就是个。。(跑得快哇!!!)

列表生成式和推导式

  • Python 中使用一行代码实现一个蒙特卡洛积分计算圆周率
    • 前三行代码没有简化的意义
import random
random.seed(0)
num_points = 1000000
print(4 * sum([1 for x,y in [(random.uniform(-1,1),random.uniform(-1,1)) for _ in range(num_points)] if x**2+y**2<=1])/num_points)
  • 现在使用Python实现一个蒙特卡洛积分
    • 没有分层抽样或者什么高难度操作
      • 我知道有一些代码是可以省略的
      • 但是这没有太大意义了
import random,numba
random.seed(0)

f = lambda x:x**2+2*x+1
n = 1000000
a = -1
b = 1
print((b-a) * sum([f(xi) for xi in [random.uniform(a,b) for _ in range(n)]])/n)

  • 现在使用Python实现一个高维度的蒙特卡洛积分
    • 没有分层抽样或者什么高难度操作
      • 我知道有一些代码是可以省略的
      • 但是这没有太大意义了
import random
random.seed(0)

dim = 10
N = 100000
f = lambda x:sum([xi**2 for xi in x])

print(2**dim *sum([f([random.uniform(0,1) for j in range(dim)]) for i in range(N)])/N)


  • 上面我们只使用了几行简短的代码便实现了很多非常复杂(不是)的功能
    • 但这完全不能显示我们的实力是不是

注意

  • 我们简化代码的核心目的是方便操作,而不是单纯得炫技,只会炫技代码,那么肯定是要吃亏的,你去哪里调控你的项目呢。代码越短,读起来越复杂,越难以copy。同样的,IO如果被过度简化了,那就是操作人员的噩梦而不仅仅是pirate的噩梦了。

装饰器

  • 装饰器本身就可以简化代码
import random,time
random.seed(0)

def measure_time(func):
    def wrapper(*args, **kwargs):
        begin_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("函数 {0} 运行时间为:{1:.6f}秒".format(func.__name__, end_time - begin_time))
        return result
    return wrapper

@measure_time
def monte_carlo_area(func,min_x,max_x,min_y,max_y,num_samples):
    return (max_x - min_x) * (max_y - min_y) * sum([func(random.uniform(min_x,max_x),random.uniform(min_y,max_y))*1 for i in range(num_samples)]) / num_samples

in_circle = lambda x,y:x**2 + y**2 <= 1
in_function = lambda x,y:x**2 + y**2 + x*y <= 1

# 模拟圆的面积
print(monte_carlo_area(in_circle,-1,1,-1,1,1000000))
# 模拟函数的面积
print(monte_carlo_area(in_function,-1,1,-1,1,1000000))

Python标准库

  • Python 标准库就是一种最简单的炫技的方式

itertools

  • itertools实现排列与组合,下面是案例(与列表生成器做了对比)
import itertools

# 排列
items = ["a","b","c"]
perms = itertools.permutations(items)
for perm in perms:
    print(perm)

# 组合
combs = itertools.combinations(items, 2)
for comb in combs:
    print(comb)

# 排列
lst = ["a","b","c"]
permutations = [(a, b, c) for a in lst for b in lst if b != a for c in lst if c != a and c != b]
print(permutations)

# 组合
combinations = [(a, b, c) for i, a in enumerate(lst) for j, b in enumerate(lst) for k, c in enumerate(lst) if i < j < k]
print(combinations)

functools

  • 案例 :事实上,我认为这个模块比较鸡肋
import time
from functools import wraps

def calculate_time(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {func.__name__} execution time: {end_time - start_time:.5f}s")
        return result
    return wrapper

@calculate_time
def scientific_calculation(num1,num2):
    return num1 + num2

result = scientific_calculation(10, 20)
print(result)


  • 好了,上面那些代码显然还不够眼花缭乱,毕竟只要认真阅读,用手推一推就可以实现的
  • 所以我觉得我们应该上一些代码混淆与加密技术

代码混淆与加密技术

  • pyarmor
    • 创建一个Python文件
    • 在终端中,进入test.py所在的目录,然后使用以下命令对test.py进行加密:
pyarmor obfuscate test.py
  •       会生成一个文件夹,文件夹里的文件就是混淆后的Python文件,可以直接运行
  • 设置文件的使用期限
    • 利用 lic文件
from datetime import datetime, timedelta
import pyarmor

#使用期限为30天
expire_date = datetime.now() + timedelta(days=30)


lic = pyarmor.get_license()

lic.set_license_attr('expire_date', expire_date)

lic.save('license.lic')
  • 或者在控制台中完成
pyarmor licenses --expired 2023-05-26
pyarmor obfuscate --licenses license.lic --output main.py


  • 谈到科学计算,怎么能够少得了numpy大显神威呢?下面就是一个绝佳的例子。
    • 一个简单的统计案例

我的一篇文章文章来源地址https://www.toymoban.com/news/detail-463327.html

import sys
import numpy as np
import xlrd as xl
import csv
import copy
 
class SCORE():
    def __init__(self,Lmin=85,Lmax=99,address="",Type=".csv"):
        self.address = address
        self.Type = Type
        self.Lmin = Lmin
        self.Lmax = Lmax
        try:
            self.Weight = self.readfile(self.address+"Weight"+self.Type)
            self.data = self.readfile(self.address+"data"+self.Type)
        except:
            print("读取异常")
            sys.exit()
 
        #数据转换成float64
        self.data = self.data.astype("float64")
        self.Weight = self.Weight.astype("float64")
        self.DATA = copy.deepcopy(self.data)
        
    def readfile(self,Address):
        print(Address)
        with open(Address) as f:
            f_csv = csv.reader(f)
            headers = next(f_csv)
            List = []
            for row in f_csv:
                List.append(row)
        if len(List)>1:
            return np.array(List)
        else:
            return np.array(List[0])
    
    def data_check(self):        
        #检查矩阵是否完整
        try:
            GROPU_num,Test_num = self.data.shape
        except:
            print("矩阵维度超标!")
            sys.exit()
 
        #检查元素是否非负
        if np.min(np.min(self.data))>=0:
            return GROPU_num,Test_num
        else:
            print("含负元素")
            sys.exit()
        
    def supplement(self):
        GROPU_num,Test_num = self.data_check()
        for gn in range(GROPU_num):
            self.data[gn][np.where(self.data[gn]==0)]=sum(self.data[gn][np.where(self.data[gn]!=0)])/len(self.data[gn][np.where(self.data[gn]!=0)])
        print("缺省元素补充完毕")
        
    def standardization(self):
        GROPU_num,Test_num = self.data_check()
        for tn in range(Test_num):
            ave = sum(self.data[:,tn])/GROPU_num
            delta = (sum((self.data[:,tn]-ave)**2)/(GROPU_num-1))**0.5
            self.data[:,tn] = (self.data[:,tn]-ave)/delta
        print("数据标准化完毕")
 
    def calculate_M(self):
        #检查权重矩阵
        GROPU_num,Test_num = self.data_check()
        assert(len(self.Weight)==Test_num),"权重矩阵长度不符合" 
        self.supplement()
        self.standardization()
        self.data *= self.Weight
        return np.array([sum(i) for i in self.data])
 
    def calculate_L(self):
        GROPU_num,Test_num = self.data_check()
        Mscore = self.calculate_M()
        Mmax = max(Mscore)
        Mmin = min(Mscore)
        Mscore = (Mscore*(self.Lmax-self.Lmin)-Mmin*self.Lmax+Mmax*self.Lmin)/(Mmax-Mmin)
        return Mscore
 
s1 = SCORE()
L = s1.calculate_L()
print("Final marks",L)
input("key to exit")

到了这里,关于科学计算中那些眼花缭乱的Python的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 猿创征文|那些年我们追过的那些技术

           11年正式进入IT行业,成为一名程序员。那时候的技术圈还停留在语言之争上,那时候争论的是到底谁是世界上最好的编程语言,php说过自己是世界上最好的语言,C#说过自己是世界上最好的语言,那时候Python这个小兄弟还没来到Top3,彼时JAVA长期位于榜首。随着技术的

    2023年04月24日
    浏览(41)
  • python实现科学计算与自定义手绘风

    目标: 1.运用科学计算库进行矩阵分析和数值运算; 2.掌握numpy库的使用。 要点:这是一个使用 numpy 和 PIL 库提取图像特征形成手绘效果的实例。 使用PIL库获取了图像的轮廓,虽然提取了轮廓,但这个轮廓缺少立体感,视觉效果不够丰满。 光线照射使立体物出现明暗变化,运

    2024年02月06日
    浏览(31)
  • Python科学计算进阶:数值积分与微分求解算法应用在Python

    在Python中进行科学计算时,数值积分和微分是非常常见的操作。下面我将介绍几种常用的数值积分和微分求解算法,并给出Python代码示例。 一、数值积分 矩形法 矩形法是一种简单的数值积分方法,它使用矩形近似代替被积函数。这种方法虽然简单,但对于某些简单函数可以

    2024年02月02日
    浏览(49)
  • Anaconda配置Python科学计算库SciPy的方法

      本文介绍在 Anaconda 环境中,安装 Python 语言 SciPy 模块的方法。    SciPy 是基于 Python 的科学计算库,用于解决科学、工程和技术计算中的各种问题。它建立在 NumPy 库的基础之上,提供了大量高效、易于使用的功能,包括统计分析、信号处理、优化、线性代数、图像处理

    2024年02月02日
    浏览(38)
  • 【Python童年游戏】满满的回忆杀—那些年玩过的童年游戏你还记得吗?那个才是你的菜?看到第一个我就泪奔了(致我们逝去的青春)

    滴一一学生卡🙌 结伴上车的学生仔子们 用笑声打破车厢的沉默 大人眼里的晚高峰 是给放学后快乐😀时光的加时 下车的学生匆匆起身带起 一阵熟悉的栀子香于💓 是关于校园的记忆 开始零零散散地闪现 放学后集合的秘密基地/跟着城市变了模样 超级马里奥里的隐藏地图😁

    2023年04月09日
    浏览(43)
  • 【ZYNQ】那些年我们拿下了 Zynq

    小菜鸟的 Zynq 学习经验分享~ 资料来源 :黑金 Zynq7035 开发板配套资料,完全适合于 Zynq 学习。 文末获取资料! 另外四个是关于 Altera FPGA 的学习资料。 其实很多东西都是相通的,要学会 举一反三 。 Vivado 是 Xilinx FPGA 开发的主要软件(2019年10月,赛灵思推出了Vitis)。 下载软

    2023年04月20日
    浏览(34)
  • Python和Julia TensorFlow科学计算常微分方程求解器

    常微分方程(ODE)可用于描述动态系统。 从某种程度上来说,我们生活在一个动态系统中,窗外的天气从黎明到黄昏都在变化,我们体内发生的新陈代谢也是一个动态系统,因为随着时间的推移,成千上万的反应和分子被合成和降解。 更正式地说,如果我们定义一组变量,

    2024年02月01日
    浏览(34)
  • python库,科学计算与数据可视化基础,知识笔记(numpy+matplotlib)

    这篇主要讲一下数据处理中科学计算部分的知识。 之前有一篇pandas处理数据的。 讲一下这几个库的区别。 Pandas主要用来处理类表格数据(excel,csv),提供了计算接口,可用Numpy或其它方式进行计算。 NumPy 主要用来处理数值数据(尤其是矩阵,向量为核心的),本质上是纯

    2024年02月02日
    浏览(49)
  • python实战应用讲解-【numpy科学计算】line_profiler模块(附python示例代码)

    目录   Numpy 安装line_profiler 准备工作 具体步骤 Numpy 用line_profiler分析代码 具体步骤 攻略小结

    2023年04月08日
    浏览(51)
  • 关键词采集工具可以帮助我们做那些方面的工作

    针对搜索引擎的采集工具可以帮助我们做那些方面的工作,至少从10个工作场景说明,并列举详细的使用场景 Msray-plus,是一款企业级综合性爬虫/采集软件。 支持亿级数据存储、导入、重复判断等。无需使用复杂的命令,提供本地WEB管理后台对软件进行相关操作,功能

    2023年04月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包