NumPy 和线性代数

本文主要介绍如何使用 Python 模块 NumPy 进行矩阵计算,并作为在伯克利学习或将学习 EECS 16A 的人的参考。

什么是 NumPy?

NumPy 是用于科学计算的库。据官网介绍,

NumPy 是 Python 中科学计算的基础包。它是一个 Python 库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。

如何导入 NumPy

要开始 Numpy 之旅,我们需要先导入 NumPy。下面的代码将 NumPy 库作为np.

# install NumPy and named 'np'
import numpy as np

创建 NumPy 数组对象

NumPy 数组对象与 Python List 非常相似(对 List 的引用)。然而,与 Python List 不同的是,某些方法不支持 NumPy(例如 sort() 和 reverse())。在 Numpy 中,向量和矩阵都存储在ndarray(※ N 维数组的缩写)中。但是,使用强制转换,您可以使用 Python List 方法或 NumPy 方法。有多种方法可以使用 NumPy 创建矩阵。

示例 1(创建矩阵array()

创建可迭代对象并将其插入到 NumPy 数组中array()

数组()参考

# normal Python List
list = [1, 2, 3, 4, 5]
# normal Python Tuple
tup = ((1, 2, 3, 4, 5), (6, 7, 8, 9, 10))

# NumPy Array object
mtx1 = np.array(list)
mtx2 = np.array(tup)

print("list :\n", list)
print("mtx1 :\n", mtx1)

print("tup :\n", tup)
print("mtx2 :\n", mtx2)

# output
list :
 [1, 2, 3, 4, 5]
mtx1 :
 [1 2 3 4 5]
tup :
 ((1, 2, 3, 4, 5), (6, 7, 8, 9, 10))
mtx2 :
 [[ 1  2  3  4  5]
 [ 6  7  8  9 10]]

示例 2(使用 插入每个组件empty()

使用empty([<SIZE OF ROW>, <SIZE OF COLMN>])可以创建空的 NumPy 数组,也可以使用dtype关键字来限制数据类型。但是,由 empty() 创建的数组本身设置了完全随机数,您需要对其进行初始化。

mtx = np.empty([3,3])
for i in range(3):
    for j in range(3):
        mtx[i, j] = i + j # initializing Numpy Array.

print("mtx: \n", mtx)

mtx: 
 [[0\. 1\. 2.]
 [1\. 2\. 3.]
 [2\. 3\. 4.]]

Example3(标识数组eye()和全零数组zeros()

在某些情况下,有一种更简单的方法来创建数组。例如,要创建一个恒等数组,一个对角元素为 1,其他元素为 0,其中所有对角元素为 1eye()的方阵,比创建数组并将所有元素对角线初始化为 1 简单得多。此外,零向量零矩阵,其中所有分量为零的向量或矩阵,可以使用创建zeros()

eye() 参考
zeros() 参考

# to create identity matrix
identity_mtx = np.eye(5)
print("identity matrix\n", identity_mtx)

# to create zeros matrix
zero_mtx = np.zeros([5,5])
print("zeros matrix\n",zero_mtx)

# output
identity matrix
 [[1\. 0\. 0\. 0\. 0.]
 [0\. 1\. 0\. 0\. 0.]
 [0\. 0\. 1\. 0\. 0.]
 [0\. 0\. 0\. 1\. 0.]
 [0\. 0\. 0\. 0\. 1.]]
zeros matrix
 [[0\. 0\. 0\. 0\. 0.]
 [0\. 0\. 0\. 0\. 0.]
 [0\. 0\. 0\. 0\. 0.]
 [0\. 0\. 0\. 0\. 0.]
 [0\. 0\. 0\. 0\. 0.]]

NumPy 数组上的广播算术操作

通过使用 NumPy 模块,您不再需要手动计算矩阵。

import numpy as np
mtx = np.array([[1,1,1], [1,1,1], [1,1,1], [1,1,1]])

print("mtx\n", mtx)

print("mtx1 + 10\n", mtx + 10) # addtion
print("mtx2 - 1\n", mtx - 1) # substitution
print("mtx1 * 10\n", mtx * 10) # multiplication
print("mtx2 / 10\n", mtx / 10) # division

# output
mtx
 [[1 1 1]
 [1 1 1]
 [1 1 1]
 [1 1 1]]
mtx1 + 10
 [[11 11 11]
 [11 11 11]
 [11 11 11]
 [11 11 11]]
mtx2 - 1
 [[0 0 0]
 [0 0 0]
 [0 0 0]
 [0 0 0]]
mtx1 * 10
 [[10 10 10]
 [10 10 10]
 [10 10 10]
 [10 10 10]]
mtx2 / 10
 [[0.1 0.1 0.1]
 [0.1 0.1 0.1]
 [0.1 0.1 0.1]
 [0.1 0.1 0.1]]

访问 NumPy 数组的元素

始终提醒您,数组索引以0开头,并且不包括行或列的末尾。

import numpy as np

mtx = np.array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])

print("original matrix\n", mtx)

# Accessing the first row
print("Accessing the first row\n", mtx[0])
# Accessing the second col
print("Accessing the second col\n", mtx[:,1])
# Accesing the element at 2nd col and 2nd row
print("Accesing the element at 2nd col and 2nd row\n", mtx[1, 1])
# Accessing the matrix at 1-2 col and 1-2 row
print("Accessing the matrix at 1-2 col and 1-2 row\n", mtx[:2, :2]) 
# becareful the end of col or row is not included

# output
original matrix
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
Accessing the first row
 [1 2 3]
Accessing the second col
 [2 5 8]
Accesing the element at 2nd col and 2nd row
 5
Accessing the matrix at 1-2 col and 1-2 row
 [[1 2]
 [4 5]]

点积(内积)

利用np.dot(), 可以轻松解决烦人的矩阵点积问题。但是,要计算矩阵,必须匹配内部维度。

import numpy as np

a = np.array([[1, 2, 3],[4, 5, 6]])
b = np.array([[1, 2],[3, 4],[5, 6]])

print('the dot product of a and b\n', np.dot(a, b))

# output
the dot product of a and b
 [[22 28]
 [49 64]]

转置

转换原始矩阵的行和列的矩阵称为矩阵的转置。例如,矩阵 m × n 的转置为 n × m。

import numpy as np

mtx = np.array([[1, 2, 3], [4, 5, 6]])
print("original matrix\n", mtx)

transposed = np.transpose(mtx)

print("transposed matrix\n", transposed)

# output

original matrix
 [[1 2 3]
 [4 5 6]]
transposed matrix
 [[1 4]
 [2 5]
 [3 6]]

逆函数

col 和 row 相同的矩阵称为方阵。只有一个矩阵,使得某个方阵与它的点积为单位矩阵,该矩阵称为逆矩阵。通常,手动找到矩阵的逆矩阵非常困难。但是,np.linalg.inv()有助于找到矩阵的逆矩阵。

import numpy as np

mtx = np.array([[1, 2], [3, 4]])

inversed = np.linalg.inv(mtx)

print("original matrix\n", mtx)

print("inverse matrix\n",inversed)

print("the dot product of the original matrix and inverse matrix\n",np.dot(mtx, inversed))

# output

original matrix
 [[1 2]
 [3 4]]
inverse matrix
 [[-2\.   1\. ]
 [ 1.5 -0.5]]
the dot product of the original matrix and inverse matrix
 [[1.0000000e+00 0.0000000e+00]
 [8.8817842e-16 1.0000000e+00]]

文章来源:https://kojiro.hashnode.dev/numpy-and-linear-algebra

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

推荐阅读更多精彩内容

  • 矩阵 1. 矩阵初始化 Numpy函数库中存在两种不同的数据类型(矩阵matrix和数组array),都可以用于处...
    陨星落云阅读 775评论 1 9
  • 标题中的英文首字母大写比较规范,但在python实际使用中均为小写。 1.Numpy中的matrix 1.1 创建...
    潇洒坤阅读 1,764评论 0 0
  • 矩阵乘法的dot NumPy提供了一个用于矩阵乘法的dot函数 numpy.linalg中有一组标准的矩阵...
    _aLIEz阅读 399评论 0 1
  • 补充 比较操作(条件判断里用)==等于!=不等于is是相同对象is not是不同对象关于 is 操作符is 与 =...
    Bounty_Hunter阅读 932评论 0 0
  • 这两周学习numpy,确实感觉在一些数学问题上很方便. 案例一,求解方阵的特征值和特征向量. 求解代码如下: 运行...
    AndyDennisRob阅读 793评论 0 0