草庐IT

科学计算库Numpy基础&提升(理解+重要函数讲解)

苑无违的博客 2023-04-15 原文

Intro

对于同样的数值计算任务,使用numpy比直接编写python代码实现 优点:

  • 代码更简洁: numpy直接以数组、矩阵为粒度计算并且支持大量的数学函数,而python需要用for循环从底层实现;
  • 性能更高效: numpy的数组存储效率和输入输出计算性能,比python使用list好很多,用numpy进行计算要比原生Python快得多,而且数据量越大,效果越明显;numpy的大部分代码都是c语言实现的,这是numpy比python高效的原因

numpy核心:ndarray对象

ndarray对象

  • numpy的核心数据结构,叫做array就是数组,array对象可以是一维数组,也可以是多维数组
  • python的list也可以实现相同的功能,但是array的优势在于性能好,包含数组元数据信息、大量的便捷函数
  • 成为 Scipy、Pandas、scilit-learn、tensorflow、paddlepaddle等框架的通用底层语言
  • numpy的array和python的list的一个区别是它的元素必须都是同一种数据类型,这也是numpy高性能的一个原因

ndarray属性

个人以前会弄混shape和size,注意shape打印的是数组的形状是一个元组,size则是表示数组大小即总共有多少个元素

  • shape 返回一个元组 表示array的形状
  • ndim 返回一个数字 表示array的维度的数目
  • size 返回一个数字 表示array中所有数据元素的数目
  • dtype array中元素的数据类型,a.astype(str) 可以把a数组元素转为str类型
  • itemsize 表示数组中每个元素的字节大小

创建array的方法

  • 从Python的列表list和嵌套列表创建array,np.array([...])
  • 使用函数arange、linspace等创建等差数组,np.arange(start,stop,step,dtype) 左闭右开,np.linspace(start,stop,num,endpoint) 默认左右取闭,num是要删除的等间隔样例数量(默认50),endpoint 序列中是否包含stop值, 默认为true
  • 使用ones、ones_like、zeros、zeros_like、empty、empty_like、full、full_like、eye等函数创建,注意使用empty创建的数据是未初始化的,里面的值可能是随机值不要用,full则是将一个给定大小的数组填满固定值,用法如np.full((2, 4), 666)
  • 生成随机数的np.random模块创建,np.random.seed(2022) 设置随机种子,使得每次随机的结果固定,np.random.rand(2,5) 随机生成 2行5列的2维数组,返回数据在[0,1)之间;np.random.randint(2,5,5) 在[2,5) 范围内生成5个随机整数;np.random.uniform(2,5,10) 在 [2,5) 之间 生成均匀分布的10个数字;np.random.uniform(2,5,(2,5)) 在 [2,5) 之间 生成均匀分布的(2,5)个数字; np.random.randn((2,5)) 则返回有标准正态分布的数据,均值1方差0;np.random.normal(1,10,(2,5)) 则可指定均值和标准差;另外,choice 从给定的数组里 生成随机结果,shuffle 把一个数组进行随机排列(如果数组是多维的 则只会在第一维度打散数据),permutation 把一个数组进行随机排列 ,或者数字的全排列,两者功能相同但permutation不会更改原来的arr 会返回一个新的copy

numpy的数组索引

三种索引方法:

  • 基础索引,切片法,不详细叙述
  • 神奇索引,就是用整数数组进行的索引,比如对于x = np.arange(10),可以用x[np.array([[0,2],[1,3]])]来取x对应位置的值;对于二维数组,Y[:,[0, 2]] 筛选第0和第2列,Y[[0,2,3],[1,2,3]]同时指定行列
  • 布尔索引,对于x = np.arange(10),可以用x>5返回bool值的数组,x[x>5] = 1通过条件进行赋值,把x中大于5的值全部赋为1,x[x<5] += 20,小于5的值全部加20,还可以进行条件组合,比如x[(x%2==0)| (x>7)]x[(x%2==0)& (x>7)];注意对于二维数组Y = np.arange(20).reshape(4, 5) 来说,既有行又有列 因此返回的是 行列一维数组Y[Y>5] 返回的是行列一维数组,可以用Y[:, 3][Y[:, 3]>5] 把第3列大于5的行数据筛选出来

numpy数据操作

数组数学操作

A*B是对应位置元素相乘,对于arr = np.arange(12).reshape(3,4),可以用各种数学统计函数,包括sum,prod(元素乘积),cumsum(np.cumsum(arr)从头到尾累加,每加一次输出一个元素),cumprod(累积),min,max,median,mean,np.percentile(arr,[25,50,75])np.quantile(arr,[0.25,0.5,0.75])求取数列第?分位的数值(后者范围为0-1),std(标准差)

,var(方差),np.average(arr, weights=np.random.rand(*arr.shape)) 加权平均,argmax 寻找最大值的下标

  • 对于numpy的聚合类函数的axis参数解释:axis=0代表行 axis=1 代表列,axis=0 代表把行消解掉,axis=1 代表把列消解掉;axis=0 代表跨行计算, axis=1 代表跨列计算

数组合并操作

对于a = np.arange(9).reshape(3,3)以及b = np.arange(9,18).reshape(3,3),合并行(行变多)使用np.concatenate([a,b])np.vstack([a,b])np.row_stack([a,b]) ,合并列(列变多)使用np.concatenate([a,b],axis=1)np.hstack([a,b])np.column_stack([a,b])

参考

[1-5 Numpy教程 — 梗直哥随笔 v0.1 文档 (gengzhige-essay.readthedocs.io)](https://gengzhige-essay.readthedocs.io/docs/01 环境配置/1-5 Numpy教程.html)

科学计算库Numpy - mathor (wmathor.com)

有关科学计算库Numpy基础&提升(理解+重要函数讲解)的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  6. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  7. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  8. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  9. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  10. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

随机推荐