Numpy使用

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

一、Numpy安装

使用pip工具安装

python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose

--user 选项可以设置只安装在当前的用户下,而不是写入到系统目录。

Linux 下安装
Ubuntu & Debian

sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose

CentOS/Fedora

sudo dnf install numpy scipy python-matplotlib ipython python-pandas sympy python-nose atlas-devel

Mac 系统

Mac 系统的 Homebrew 不包含 NumPy 或其他一些科学计算包,所以可以使用以下方式来安装:

python -m pip install numpy scipy matplotlib

验证是否成功:

➜  ~ python3
Python 3.6.5 (default, May 28 2018, 22:41:59)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from numpy import *
>>> eye(4)
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])

1、Numpy数据类型

NumPy支持比Python更多种类的数值类型。下表列出了NumPy中定义的不同数据类型。

数据类型 描述
boo_ 存储一个字节的布尔值(true or false)
int_ 默认整数,相当于 C 的long,通常为int32或int64
intc 相当于 C int,通常为int32或int64
intp 用于索引的整数,相当于 C 的size_t,通常为int32或int64
int8 1个字节(-128 ~ 127)
int16 16 位整数(-32768 ~ 32767)
int32 32 位整数(-2147483648 ~ 2147483647)
int64 64 位整数(-9223372036854775808 ~ 9223372036854775807)
uint8 8 位无符号整数(0 ~ 255)
uint16 16 位无符号整数(0 ~ 65535)
uint32 32 位无符号整数(0 ~ 4294967295)
uint64 64 位无符号整数(0 ~ 18446744073709551615)
float_ float64的简写
float16 半精度浮点:符号位,5 位指数,10 位尾数
float64 双精度浮点:符号位,11 位指数,52 位尾数
complex_ complex128的简写
complex64 复数,由两个 32 位浮点表示(实部和虚部)
complex128 复数,由两个 64 位浮点表示(实部和虚部)
complex256 复数,128位
object Python对象类型
string_ 修正的ASCII字符串类型
unicode_ 修正的Unicode类型

小技巧:int8,int16,int32,int64 可替换为等价的字符串 'i1','i2','i4',其他类型也有类似的缩写。

np.astype显式地转换数据类型
Numpy还有一些预先定义的特殊值:

比如:np.nannp.pinp.e

np.nan: 缺失值,或者理解为'不是一个数'
np.pi:圆周率 3.1415926...
np.e:自然数e 2.718281828459045...

一、Numpy 数组

1、数组创建

1).使用array方法。使用Python列表或者原则作为参数如:
a1 = np.array([2,3,4])
a2 = np.array((1,23,3))

数组的类型将根据序列中元素的类型推导出来。同时array自动将二维或三维序列转换为对应的二维或者三维数组。
Numpy数组被创建时也可以制定数据的类型如:

c = np.array([2,3,4], dtype=complex)

我们也可以创建一个都是0的数组或者都是1的数组例如:
使用zero创建一个都是0的数组:

b1 = np.zeros((3,4))
b = np.zeros((5,), dtype=np.float)

创建一个全部为1的数组

np.ones((2,3,4), dtype=np.int16) # 制定类型

创建一个为空的数组:

np.empty((2,3))

可能返回未初始化的垃圾数值,不安全

创建一个全有8组成的数组:

np.full((3,4), 8)
2). 返回array序列函数

使用arange返回array序列函数:np.arange(start, stop, step, dtype)
使用linspace函数:np.linspace(start, stop, num. endpoint, retstep, dtyp)
备注:arange浮点会有精度问题,可以使用linspace
更多类似的函数有:array, zeros, zeros_like, ones, ones_like, empty, empty_like, arange, linspace, numpy.random.rand, numpy.random.randn, fromfunction, fromfile

2、数组运算

对数组进行算术运算,就会对整个数组的所有元祖进行逐一运算,并将运算结果保存在一个新数组内,不破坏原始数组。

>>> a = np.array([20,30,40,50])
>>> b = np.arange(4)
>>> b
array([0, 1, 2, 3])
>>> c = a+b
>>> c
array([20, 31, 42, 53])
>>> b**2
array([0, 1, 4, 9])
>>> np.sin(a)
array([ 0.91294525, -0.98803162,  0.74511316, -0.26237485])

计算矩阵乘法:使用@或者dot(),如

>>> A = np.array([[1,1], [0,1]])
>>> B = np.array([[2,0], [3,4]])
>>> A @ B
array([[5, 4],
       [3, 4]])
>>> A.dot(B)
array([[5, 4],
       [3, 4]])

对于+=*=这一类操作符,会修改原始的数组,而不是新建一个。

3、通用函数

函数名 描述
abs 逐个元素进行绝对值计算
fabs 复试的绝对值计算
sqrt 平方根
square 平方
exp 自然指数函数
log 以e为底的对数
log10 以10为底的对数
log2 以2为底的对数
sign 计算每个元素的符号值
ceil 计算每个元素的最高整数值
floor 计算每个元素的最小整数值
rint 保留到整数位
modf 分别将元素的小数部分和整数部分按数组形式返回
isnan 判断每个元素是否为NaN,返回布尔值
isfinite 返回数组中的元素是否有限
isinf 返回数组中的元素是否无限
cos 余弦
sin 正弦
tan 正切
arccos 反余弦
arcsin 反正弦
arctan 反正切

下面是部分二元通用函数:

函数名 描述
add 将数组的对应元素相加
subtract 在第二个数组中,将第一个数组中包含的元素去除
multiply 将数组的对应元素相乘
divide 相除
floor_divide 整除,放弃余数
power 幂函数
maxium 逐个元素计算最大值
minimum 逐个元素计算最小值
mod 按元素进行求模运算

4、索引切片迭代

Numpy的切片操作,默认是修改原数组的,而不是原生Python那样,以复制为主。

>>> a = np.arange(10)**3
>>> a
array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
>>> a[2]
8
>>> a[2:5]
array([ 8, 27, 64])
>>> a[:6:2]
array([ 0,  8, 64])
>>> a[:6:2]=-1000
>>> a
array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,
         729])
>>> a[::-1]
array([  729,   512,   343,   216,   125, -1000,    27, -1000,     1,
       -1000])

5、添加删除去重

下面是几个常见的数组操作:

  • append:将值添加到数组末尾
  • insert: 沿指定轴将值插入到指定下标之前
  • delete: 返回删掉某个轴的子数组的新数组
  • unique: 寻找数组内的唯一元素

6、形状变换

可以通过数组的shape属性,查看它的形状,reshape方法不会修改数组本身,resize则正好相反:

7、堆积数组

可以在不同的轴上堆积数组:

>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[7., 4.],
       [8., 8.]])
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[3., 0.],
       [0., 1.]])
>>> np.vstack((a,b))
array([[7., 4.],
       [8., 8.],
       [3., 0.],
       [0., 1.]])
>>> np.hstack((a,b))
array([[7., 4., 3., 0.],
       [8., 8., 0., 1.]])
>>> np.column_stack((a,b))
array([[7., 4., 3., 0.],
       [8., 8., 0., 1.]])

8、分割数组

使用hsplit,可以沿着数组的水平轴拆分数组,方法是指定要返回的相等形状数组的数目,或者指定在其后面进行拆分的列:

>>> a = np.floor(10*np.random.random((2,12)))
>>> a
array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.],
       [8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]])
>>> np.hsplit(a,3)
[array([[3., 3., 9., 3.],
       [8., 1., 4., 0.]]), array([[3., 1., 6., 5.],
       [0., 1., 5., 9.]]), array([[2., 2., 3., 5.],
       [9., 0., 8., 9.]])]
>>> np.hsplit(a, (3,4))
[array([[3., 3., 9.],
       [8., 1., 4.]]), array([[3.],
       [0.]]), array([[3., 1., 6., 5., 2., 2., 3., 5.],
       [0., 1., 5., 9., 9., 0., 8., 9.]])]
>>> np.array_split(a,3)
[array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.]]), array([[8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]]), array([], shape=(0, 12), dtype=float64)]
>>> np.array_split(a,3, axis=0)
[array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.]]), array([[8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]]), array([], shape=(0, 12), dtype=float64)]
>>> np.array_split(a,3, axis=1)
[array([[3., 3., 9., 3.],
       [8., 1., 4., 0.]]), array([[3., 1., 6., 5.],
       [0., 1., 5., 9.]]), array([[2., 2., 3., 5.],
       [9., 0., 8., 9.]])]

9、视图和复制

在操作或变换数组的时候,有时候会修改数组本身,有时候又不会,具体分为下面三种情况:

  • 完全不复制
  • view视图(view)
  • 深度拷贝(copy)

10、统计方法

方法 说明
sum 求和
mean 算术平均数
std 标准差
var 方差
min 最小值
max 最大值
argmax 最大元素在指定轴上的索引
argmin 最小元素在指定轴上的索引
cumsum 累积的和
cumprod 累积的乘积

11、随机数

numpy 带一个random模块,下表是部分函数:

函数 功能
random 返回一个区间[0.0, 1.0)中的随机函数
seed 向随机数生成器传递随机状态种子
permutation 返回一个序列的随机排列,或者返回一个乱序的整数范围序列
shuffle 随机排列一个序列
rand 从均匀分布中抽取样本
randint 根据给定的有低到高的范围抽取随机整数
randn 从均值0,方差1的正态分布中抽取样本
normal 从正态分布中抽取样本
beta 从beta分布中抽取样本
gamma 从伽马分布中抽取样本
uniform 从均匀[0, 1)中抽取样本
... ...
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 5,107评论 0 18
  • 1. numpy简单介绍 numpy 是采用c语言编写,相对python自带的list数组,好处是采用的矩阵运算,...
    淘码小工阅读 1,222评论 0 1
  • Jupyter 启动 jupyter notebook magic methed jupyter notebook...
    入间阅读 475评论 0 1
  • 换工作之后,PYTHON就放下啦,基本没接触了,也都忘记的差不多了,现在重新捡起来 1.1 NumPy Array...
    wqh8384阅读 564评论 0 1
  • NumPy是Python中关于科学计算的一个类库,在这里简单介绍一下。 来源:https://docs.scipy...
    灰太狼_black阅读 1,220评论 0 5