Numpy库的使用介绍

导言

Numpy库是Python进行科学计算的基础库,它是一个由多维数组对象组成,包含数学运算、逻辑运算、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等功能。本文将介绍Numpy库的基本操作和简单应用。

官方参考文档链接: NumPy Reference — NumPy v1.20 Manual

1 Numpy库的安装

在Linux和macOS系统下的安装:

sudo pip install numpy

在Windows系统下的安装:

pip install numpy

2 Numpy 数组

首先导入numpy

import numpy as np

我们可以使用np.zeros创建一个只包含0的数组。

a = np.zeros(3)
print(a)
print(type(a)) # 打印变量a的类型

输出结果如下:

array([0., 0., 0.])
numpy.ndarray

Numpy数组和Python自带的列表有些类似,但是在Numpy数组中,每一个元素的数据类型必须相同。常见的数据类型包括:1. float64: 64 位浮点型数字,2. int64: 64 位整数型数字,3. bool: 8 位 True 或者 False判断。通常来说,默认的数据类型为float64

输入以下代码:

a = np.zeros(3)
print(type(a[0]))
a = np.zeros(3, dtype=int) # 把数据类型转化为整数型
print(type(a[0]))

输出结果如下:

numpy.float64
numpy.int64

3 数组维度

建立一个长度为10,元素均为0的数组z

z = np.zeros(10)

目前z数组没有维度,既不是行向量也不是列向量。数组的维度由shape属性记录,记录在一个元组中。

print(z.shape)

输出结果如下:

(10,)

输出结果中的元组只含有一个元素,代表数组的长度。为了使数组具有维度,我们可以改变shape属性。

z.shape = (10, 1)
print(z)

输出结果如下:

array([[0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.]])
z = np.zeros(4)
z.shape = (2, 2)
print(z)

输出结果如下:

array([[0., 0.],
       [0., 0.]])

4 创建数组

我们先前提到过,np.zeros能构建元素为0的数组,np.ones则与之类似,能构建元素为1的数组。另一个类似的函数是np.empty,它能在内存中创建一个空数组,以备之后填入数据。

z = np.empty(3)
print(z)

输出结果如下:

array([0., 0., 0.])

为了创建均匀间隔创建数值序列,我们可以使用np.linspace函数

z = np.linspace(start = 0, stop = 100, num = 5)
print(z)

输出结果如下:

array([ 0., 25., 50., 75., 100.])

为创建单位矩阵,我们可以使用np.identity或者np.eye函数

z = np.identity(2)
print(z)

输出结果如下:

array([[1., 0.],
       [0., 1.]])

此外,使用np.array函数,Python的列表,元组等也能转换为Numpy数组

a = np.array([10, 20]) # 使用列表构建数组
print(a)
b = np.array((10, 20), dtype=float) # 使用元组构建数组
# dtype 选项可以指定数据类型
print(b)
c = np.array([[1, 2], [3, 4]]) # 使用列表嵌套列表构建数组
print(c)

输出结果如下:

array([10, 20])
array([10., 20.])
array([[1, 2],
       [3, 4]])

Numpy数组中也存在深拷贝和浅拷贝的区别,深拷贝即再内存中新建一个数据副本,两个数组内存地址不同,可以分别修改,浅拷贝即不在内存中新建地址,仅仅引用之前的地址,两个数组内存地址相同,只能同时修改

a = np.random.randn(3)
print(a)
b = a
b[0] = 0.0
print(a)
# 浅拷贝
a = np.random.randn(3)
print(a)
b = np.copy(a)
print(b)
# 深拷贝

输出结果如下:

array([-0.09651763, -0.4620335 , 1.2756674 ])
array([ 0. , -0.4620335, 1.2756674])
array([ 0.81440966, -1.05123774, -1.24405026])
array([ 0.81440966, -1.05123774, -1.24405026])

5 数组的索引

对于一维数组或者没有维度的数组,索引的方式和Python类似

z = np.linspace(1, 2, 5)
print(z)
print(z[0])
print(Z[0:2])
print(z[-1])

输出结果如下:

array([1. , 1.25, 1.5 , 1.75, 2. ])
1.0
array([1. , 1.25])
2.0

对于多维数组,索引方式如下:

z = np.array([[1, 2], [3, 4]])
print(z)
print(z[0, 0])
print(z[0, 1])

输出结果如下:

array([[1, 2],
       [3, 4]])    
1
2

多维列表中,若要提取行和列

print(z[0, :])
print(z[:, 1])

输出结果如下:

array([1, 2])
array([2, 4])

NumPy也能通过构建新的数组作为索引提取数据

z = np.linspace(2, 4, 5)
print(z)
indices = np.array((0, 2, 3))
print(z[indices])

输出结果如下:

array([2. , 2.5, 3. , 3.5, 4. ])
array([2. , 3. , 3.5])

最后,布尔类型的数据也可用于提取元素

d = np.array([0, 1, 1, 0, 0], dtype=bool)
print(d)
print(z[d])

输出结果如下:

array([False, True, True, False, False])
array([2.5, 3. ])

6 数组的方法

数组有非常多的方法,一些常见的方法如下:

a = np.array((4, 3, 2, 1))
print(a)
print("sort =",a.sort())   # 对数组a进行排序
print("sum =",a.sum())  # 对数组a进行求和
print("mean =",a.mean())   # 求出数组a的均值
print("max =",a.max())   # 求出数组a的最大值
print("argmax =",a.argmax())   # 返回最大元素的索引
print("cumsum =",a.cumsum())   # 对每个元素累积求和
print("cumprod =",a.cumprod())    # 对每个元素累积求积
print("var =",a.var())  # 求数组a的方差
print("std =", a.std())   # 求数组a的标准差
a.shape = (2, 2)
print(a.T)  # 对数组a进行转置

输出结果如下:

array([4, 3, 2, 1])
sort = array([1, 2, 3, 4])
sum = 10
mean = 2.5
max = 4
argmax = 3
cumsum = array([ 1, 3, 6, 10])
cumprod = array([ 1, 2, 6, 24])
var = 1.25
std = 1.118033988749895
array([[1, 3],
       [2, 4]])

7 数组的操作

7.1 算术操作

a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
print(a + b)    # 加
print(a * b)    # 乘
print(a + 10)    # 对每个元素添加一个标量
print(a * 10)    # 对每个元素乘一个标量

输出结果如下:

array([ 6, 8, 10, 12])
array([ 5, 12, 21, 32])
array([11, 12, 13, 14])
array([10, 20, 30, 40])

7.2 矩阵乘法

A = np.ones((2, 2))
B = np.ones((2, 2))
print(A @ B)  # 两个矩阵相乘

输出结果如下:

array([[2., 2.],
       [2., 2.]])
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容