通用函数ufunc

一元ufunc举例:

1、abs、fabs:计算绝对值,fabs更快

2、sqrt:计算各元素的平方根,相当于arr0.5

3、square:计算各元素的平方根,相当远arr
2

4、exp:计算各元素的指数e的x次方

...

二元ufunc举例:

1、add:将数组中对应的元素想加

2、subtract:从第一个数组中减去第二个数组中的元素

3、multiply:数组元素相乘

4、divide:除法

5、power:对第一个数组中的元素A,根据第二个数组中的相应元素B,计算A的B次方。

利用数组进行数据处理

用数组表达式代替循环的做法,通常被称为矢量化,要比等价的Python方法快上一两个数量级,尤其是数值运算。

np.meshgrid函数的用法,[X,Y] = meshgrid(x,y) 将向量x和y定义的区域转换成矩阵X和Y,这两个矩阵可以用来表示mesh和surf的三维空间点以及两个变量的赋值。其中矩阵X的行向量是向量x的简单复制,而矩阵Y的列向量是向量y的简单复制。举例如下:

import numpy as np
points=np.arange(-5,5,0.01)
xs,ys=np.meshgrid(points,points)
xs
array([[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
...,
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99]])

将条件逻辑表述为数组运算

np.where函数是三元表达式x if condition else y的矢量化版本,举例:

xarr=np.array([1.1,1.2,1.3,1.4,1.5])
yarr=np.array([2.1,2.2,2.3,2.4,2.5])
cond=np.array([True,False,True,True,False])
cond
array([ True, False,  True,  True, False], dtype=bool)

假设我们想根据cond中的值来确定选择xarr还是yarr,使用列表推导式的方法如下:

result=[(x if c else y) for x,y,c in zip(xarr,yarr,cond)]

可以想到,这种方法的处理速度不是很快,无法用于多维数组。使用np.where会更为简单:

result=np.where(cond,xarr,yarr)
result
array([ 1.1,  2.2,  1.3,  1.4,  2.5])

其中where函数的第二三个参数不一定是数组,可以是标量。

cond就是负责判断,生成的数组与cond的构型一样

排序

sort方法,对于多维数组,可以接收参数,在任何一个轴向上进行排序。

np.sort返回的是数组的已排序副本,arr.sort则会修改数组本省。

例如:

arr=np.random.randn(8)
arr
array([-1.86799618,  1.17907009, -0.17769902,  1.52782505, -1.00578336,
-0.606077 , 1.24019255, 0.02054406])
arr.sort()
arr
array([-1.86799618, -1.00578336, -0.606077  , -0.17769902,  0.02054406,
1.17907009, 1.24019255, 1.52782505])
arr=np.random.randn(5,3)
arr
array([[-0.87890012,  0.83758321,  0.07969702],
[-1.12805445, -0.32557521, -0.65476785],
[ 1.33504954, 0.59905743, 3.13774442],
[-1.07642073, 0.08063416, 0.8242277 ],
[-0.40929861, -0.14981955, -1.56494243]])
arr.sort(1)
arr
array([[-0.87890012,  0.07969702,  0.83758321],
[-1.12805445, -0.65476785, -0.32557521],
[ 0.59905743, 1.33504954, 3.13774442],
[-1.07642073, 0.08063416, 0.8242277 ],
[-1.56494243, -0.40929861, -0.14981955]])
numpy.sort(a, axis=-1, kind='quicksort', order=None)

返回数组的排序副本。

参数:

a:array_like

数组要排序。

axis:int或None,可选

要排序的轴。如果为“无”,则在排序之前将数组展平。默认值为-1,沿最后一个轴排序。

kind:{'quicksort','mergesort','heapsort'},可选

排序算法。默认值为“quicksort”。

order:str或str的列表,可选

当a是定义了字段的数组时,此参数指定首先,第二等比较哪些字段。单个字段可以指定为字符串,并且不是所有字段都需要指定,但是未指定的字段仍将按照它们在dtype中出现的顺序使用,以断开关系。

返回:

sorted_array:ndarray

数组的类型和形状与a相同。

用于数组的文件输入输出

1、二进制格式保存

np.save和np.load是读写数据的两个主要函数。

2、文本文件

np.loadtxt或更为专业的np.genfromtxt函数将文本数据加载到普通的Numpy数组中

np.savetxt保存文本。

线性代数

常用的函数说明:

diag,以一维数组的形式返回方针的对角线(或对角线)元素,或将一组数组转换成方阵。

numpy.diag(v, k=0)

参数:

v:array_like

如果v是2-D数组,则返回其k对角线的副本。如果v是1-D数组,则在k对角线上返回具有v的2-D数组。

k:int,可选

有问题的对角线。默认值为0。对于主对角线上方的对角线使用k> 0,对于主对角线下方的对角线使用k 。

返回:

out:ndarray

提取的对角线或构造的对角数组。

x=np.arange(9).reshape(3,3)
np.diag(x)
array([0, 4, 8])
np.diag(x,k=1)
array([1, 5])
np.diag(x,k=-1)
array([3, 7])
np.diag(np.diag(x))
array([[0, 0, 0],
[0, 4, 0],
[0, 0, 8]])

numpy.dot(a, b, out=None)

两个数组的点积。

对于2-D数组,其等效于矩阵乘法,对于1-D数组等效于向量的内积(无共轭复数)。对于N维,它是a的最后一个轴和b的倒数第二个轴的积的和:

dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

参数:

a:array_like

第一个参数。

b:array_like

第二个参数。

out:ndarray,可选

输出参数。如果没有使用,返回必须有确切的类型。特别地,它必须具有正确的类型,必须是C连续的,并且其dtype必须是dot(a,b)将返回的dtype。这是一个性能特性。因此,如果不满足这些条件,则引发异常,而不是试图灵活。

返回:

输出:ndarray

返回a和b的点积。如果a和b都是标量或都是1-D数组,则返回标量;否则返回一个数组。如果给出out,则返回。

引发:

ValueError

如果a的最后一个维度大小与b的倒数第二个维度的大小不同。

numpy.trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None)

沿数组的对角线返回总和。

如果a是2-D,则返回具有给定偏移的沿其对角线的和,即对于所有i,元素a[i,i+offset]

如果a有两个以上的尺寸,则由axis1和axis2指定的轴用于确定返回其轨迹的2-D子数组。所得数组的形状与移除axis1和axis2的a的形状相同。

参数:

a:array_like

输入数组,从中获取对角线。

offset:int,可选

对角线与主对角线的偏移。可以是正面和负面。默认为0。

axis1,axis2:int,可选

轴将被用作应从中获取对角线的2-D子阵列的第一和第二轴。默认值是a的前两个轴。

dtype:dtype,可选

确定返回的数组和累加器元素的累加器的数据类型。如果dtype具有值None且a是小于默认整数精度的整数类型的精度,则使用缺省整数精度。否则,精度与a的精度相同。

out:ndarray,可选

数组,其中放置输出。它的类型被保留,并且它必须是保持输出的正确形状。

返回:

sum_along_diagonals:ndarray

如果a是2-D,则返回沿对角线的和。如果a具有较大的维,则返回沿对角线的和的数组。

还有几个其他的,比如:

det,计算矩阵行列式

inv,计算矩阵的逆

lstsq,计算Ax=B的最小二乘解

随机数的生成

numpy.random模块增加了一些 高效生成多种概率分布的样本值的函数,比如normal,可以得到一个标准正太分布的数组:

samples=np.random.normal(size=(4,4))
samples
array([[ 0.05362618, -1.44096904, -0.59506811, -1.14913339],
[-0.82946896, -2.47470801, -0.25017015, -0.50970962],
[-0.28899863, 0.98025628, 0.36890152, -0.26948141],
[ 0.87736262, 1.43316428, -0.28441972, 0.81287675]])

还有其他的一些函数,比如:

rand,产生均匀分布的样本值

randint,从给定的上下限范围内随机选取整数

randn,产生正态分布(平均值为0,标准差为1)的样本。

如果您觉得感兴趣的话,可以添加我的微信公众号:一步一步学Python

NumPy入门基础【2】的更多相关文章

  1. Numpy入门 - 生成数组

    今天是Numpy入门系列教程第一讲,首先是安装Numpy: $ pip install numpy numpy是高性能科学计算和数据分析的基础包,本节主要介绍生成连续二维数组.随机二维数组和自定义二维 ...

  2. tensorflow学习笔记二:入门基础 好教程 可用

    http://www.cnblogs.com/denny402/p/5852083.html tensorflow学习笔记二:入门基础   TensorFlow用张量这种数据结构来表示所有的数据.用一 ...

  3. 1.2 NumPy数组基础

    目录 第一章 numpy入门 1.2 numpy数组基础 1.2.1 数组的属性 1.2.2 数组的索引:获取单个元素 1.2.3 数组切片:获取子数组 1.2.4 数组的变形 1.2.5 数组的拼接 ...

  4. mybatis入门基础(二)----原始dao的开发和mapper代理开发

    承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...

  5. 01shell入门基础

    01shell入门基础 为什么学习和使用shell编程 shell是一种脚本语言,脚本语言是相对于编译语言而言的.脚本语言不需要编译,由解释器读取程序并且执行其中的语句,而编译语言需要编译成可执行代码 ...

  6. Markdown入门基础

    // Markdown入门基础 最近准备开始强迫自己写博文,以治疗严重的拖延症,再不治疗就“病入骨髓,司命之所属,无奈何”了啊.正所谓“工欲善其事,必先利其器”,于是乎在写博文前,博主特地研究了下博文 ...

  7. JavaScript入门基础

    JavaScript基本语法 1.运算符 运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=).算术运 ...

  8. C++ STL编程轻松入门基础

    C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...

  9. HTML入门基础教程相关知识

    HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...

随机推荐

  1. 由jtable浅谈vector<vector<Object>>的用法(转自a718515028的专栏)

    以前只用过vector<Object>  ,但是在做从数据库导出数据放到jtable中时,发现还有个vector<vector<Object>>的用法. 先说jta ...

  2. python scrapy简单爬虫记录(实现简单爬取知乎)

    之前写了个scrapy的学习记录,只是简单的介绍了下scrapy的一些内容,并没有实际的例子,现在开始记录例子 使用的环境是python2.7, scrapy1.2.0 首先创建项目 在要建立项目的目 ...

  3. Java 数字签名原理及产生

    数字签名与数字证书 关于数字签名的介绍可以参考以上这篇. 这里稍微说一下不对称加密的方式: 用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密. 这样比对称加密更安全 Java 中数字签名 ...

  4. 系统封装 ES3使用方法

    1 什么是系统封装? 系统封装,说简单就是把系统制作成镜像的方法制作Ghost镜像文件,用在系统安装上面.系统封装,不同于系统的正常安装.最本质的区别在于 系统封装 是将一个完整的系统以拷贝的形式打包 ...

  5. 解决safari中iframe嵌入不能滚动的问题

    做完了个webapp之后,开发的时候一直在浏览器上模拟ios,没有任何问题,谁知交差的时候,客户告知在ios浏览器中不能滚动嵌入的iframe,直接就滚动外层整个document了,你知道docume ...

  6. hdu 3667 /2010哈尔滨赛区H题 费用与流量为非线性关系/费用流

    题意: 在一般费用流题目改动:路过某路,每x单位流量须要花费 ai*x^2(ai为给定的系数). 開始的的时候,一看仅仅只是是最后统计费用上在改动罢了,一看例子.发现根本没那么简单(ps:以后每次写程 ...

  7. python 第一个web程序

    yum install python-setuptools easy_install pip pip install tornado yum install MySQL-python test.py里 ...

  8. 【Java】Java_18 方法

    方法(Method) 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合.   我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展 方法的要点 ...

  9. centos7 安装docker后启动报错

    启动docker   $ sudo systemctl start docker 报错. 查看状态: $ systemctl status docker.service -l 加 -l 有的行信息很长 ...

  10. iOS项目开发之仿网易彩票推荐应用

    简介 效果展示 思路分析 代码实现 Git地址 一.简介 某些公司有较多的产品时,通常会在一个产品中推广另外的一些产品,我简单的封装了一个UIControllerView,由于不同公司,要求不同.所以 ...