在NumPy中,矩阵是 ndarray 的子类,与数学概念中的矩阵一样,NumPy中的矩阵也是二维的,可以使用 mat 、 matrix 以及 bmat 函数来创建矩阵。

一、创建矩阵

mat 函数创建矩阵时,若输入已为 matrix 或 ndarray 对象,则不会为它们创建副本。 因此,调用 mat() 函数和调用 matrix(data, copy=False) 等价。

1) 在创建矩阵的专用字符串中,矩阵的行与行之间用分号隔开,行内的元素之间用空格隔开。使用如下的字符串调用 mat 函数创建矩阵:

import numpy as np

A = np.mat('1 2 3; 4 5 6; 7 8 9')
print("Creation from string:", A)

运行结果:

Creation from string:
[[1 2 3]
[4 5 6]
[7 8 9]]

2)用T属性获取转置矩阵

print("transpose A:", A.T)  # 用T属性获取转置矩阵

3)用I属性获取逆矩阵

print("Inverse A:", A.I)  # 用I属性获取逆矩阵

4)用NumPy数组进行创建矩阵

B = np.mat(np.arange(9).reshape(3, 3))
print("Creation from array:", B)#使用NumPy数组进行创建

上述运行结果:

Creation from string: 
[[1 2 3]
[4 5 6]
[7 8 9]]
transpose A:
[[1 4 7]
[2 5 8]
[3 6 9]]
Inverse A:
[[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]
[-6.30503948e+15 1.26100790e+16 -6.30503948e+15]
[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]]
Creation from array:
[[0 1 2]
[3 4 5]
[6 7 8]]

二、从已有矩阵创建新矩阵

希望利用一些已有的较小的矩阵来创建一个新的大矩阵。这可以用 bmat 函数来实现。这里的 b 表示“分块”, bmat 即分块矩阵(block matrix)。

1)先创建一个3*3的单位矩阵:

C = np.eye(3)
print("C:",C)

运行结果:

C:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]

2)创建一个与C同型的矩阵,乘以2

D = 2 * C
print ("D:",D)

运行结果:

D: 
[[2. 0. 0.]
[0. 2. 0.]
[0. 0. 2.]]

3)使用字符串创建复合矩阵:

字符串的格式与 mat 函数中一致,只是在这里你可以用矩阵变量名代替数字:

print("Compound matrix\n", np.bmat("C D;C D"))

运行结果:

Compound matrix:
[[1. 0. 0. 2. 0. 0.]
[0. 1. 0. 0. 2. 0.]
[0. 0. 1. 0. 0. 2.]
[1. 0. 0. 2. 0. 0.]
[0. 1. 0. 0. 2. 0.]
[0. 0. 1. 0. 0. 2.]]

三、通用函数

通用函数的输入是一组标量,输出也是一组标量,它们通常可以对应于基本数学运算,如加、减、乘、除等。

1、使用NumPy中的 frompyfunc 函数,通过一个Python函数来创建通用函数,步骤如下:

1)定义一个回答某个问题的Python函数

2)用 zeros_like 函数创建一个和 a 形状相同,并且元素全部为0的数组 result

3)将刚生成的数组中的所有元素设置其值为42

2、在 add 上调用通用函数的方法

通用函数并非真正的函数,而是能够表示函数的对象。通用函数有四个方法,不过这些方法只对输入两个参数、输出一个参数的ufunc对象有效,例如 add 函数。

其他不符合条件的ufunc对象调用这些方法时将抛出 ValueError 异常。因此只能在二元通用函数上调用这些方法。以下将逐一介绍这4个方法:

reduce()、accumulate()、 reduceat()、outer()

1) 沿着指定的轴,在连续的数组元素之间递归调用通用函数,即可得到输入数组的规约(reduce)计算结果。

对于 add 函数,其对数组的reduce计算结果等价于对数组元素求和。调用reduce 方法:

a = np.arange(9)
print("Reduce:", np.add.reduce(a)) #调用add函数的reduce方法

运行结果:

Reduce 36

2) accumulate 方法同样可以递归作用于输入数组

在 add 函数上调用 accumulate 方法,等价于直接调用 cumsum 函数。在 add 函数上调用 accumulate 方法:

print( "Accumulate", np.add.accumulate(a)) #调用add函数的accumulate方法

运行结果:

Accumulate [ 0  1  3  6 10 15 21 28 36]

3)educeat 方法需要输入一个数组以及一个索引值列表作为参数。

print ("Reduceat", np.add.reduceat(a, [0, 5, 2, 7]))

educeat 方法的作用是,在数列a中,分别计算索引间的累加,比如上述的 [0, 5, 2, 7],分别计算索引0-5,5-2(5>2,所以直接取索引为5的数据),2-7,7-(-1) 等四组序列形成的

比如,0-5就是计算A-E列中的数据,结果为10;5-2,直接取索引为5,即F的数据5;2-7,即B-G的计算结果为20;7-(-1)即索引7到最后,也即H、I的计算结果为15。

4)outer 方法

返回一个数组,它的秩(rank)等于两个输入数组的秩的和。它会作用于两个输入数组之间存在的所有元素对。在 add 函数上调用 outer 方法:

print("Outer:\n", np.add.outer(np.arange(3), a))

运行结果:

Outer:
[[ 0 1 2 3 4 5 6 7 8]
[ 1 2 3 4 5 6 7 8 9]
[ 2 3 4 5 6 7 8 9 10]]

四、算术运算

在NumPy中,基本算术运算符+、-和 * 隐式关联着通用函数 add 、 subtract 和 multiply ,对NumPy数组使用这些算术运算符时,对应的通用函数将自动被调用。除法包含

的过程则较为复杂,在数组的除法运算中涉及

三个通用函数 divide 、 true_divide 和floor_division ,以及两个对应的运算符 / 和 // 。
1、除法运算:

import numpy as np

a = np.array([2, 6, 5])
b = np.array([1, 2, 3]) print("Divide:\n", np.divide(a, b), np.divide(b, a))

除了divide()函数外,还有floor_divide(),以及运算符‘/’和‘//’,(‘/’和‘//’分别和divide和floor_divide作用一样)如下代码:

import numpy as np

a = np.array([2, 6, 5])
b = np.array([1, 2, 3]) print("Divide:\n", np.divide(a, b), np.divide(b, a))
print("True Divide:\n", np.true_divide(a, b), np.true_divide(b, a))#回除法的浮点数结果而不作截断 print("Floor Divide:\n", np.floor_divide(a, b), np.floor_divide(b, a)) #返回整数结果
c = 3.14*b
print("Floor Divide2:\n", np.floor_divide(c, b), np.floor_divide(b, c)) #返回整数结果 print( "/ operator:\n", a/b, b/a) # "/"运算符相当于调用 divide 函数 print( "// operator:\n", a//b, b//a) #运算符//对应于floor_divide 函数
print( "// operator2:\n", c//b, b//c)

运行结果:

Divide:
[2. 3. 1.66666667] [0.5 0.33333333 0.6 ]
True Divide:
[2. 3. 1.66666667] [0.5 0.33333333 0.6 ]
Floor Divide:
[2 3 1] [0 0 0]
Floor Divide2:
[3. 3. 3.] [0. 0. 0.]
/ operator:
[2. 3. 1.66666667] [0.5 0.33333333 0.6 ]
// operator:
[2 3 1] [0 0 0]
// operator2:
[3. 3. 3.] [0. 0. 0.]

2、模运算

计算模数或者余数,可以使用NumPy中的 mod 、 remainder 和 fmod 函数。当然,也可以使用 % 运算符。这些函数的主要差异在于处理负数的方式。

a = np.arange(-4, 4)
print('a:',a)
print ("Remainder", np.remainder(a, 2)) # remainder 函数逐个返回两个数组中元素相除后的余数
print ("Mod", np.mod(a, 2)) # mod 函数与 remainder 函数的功能完全一致
print ("% operator", a % 2) # % 操作符仅仅是 remainder 函数的简写 print ("Fmod", np.fmod(a, 2))# fmod 函数处理负数的方式与 remainder 、 mod 和 % 不同

运行结果:

a: [-4 -3 -2 -1  0  1  2  3]
Remainder [0 1 0 1 0 1 0 1]
Mod [0 1 0 1 0 1 0 1]
% operator [0 1 0 1 0 1 0 1]
Fmod [ 0 -1 0 -1 0 1 0 1]

实际代码运行如下:

 

 

Python数据分析--Numpy常用函数介绍(6)--Numpy中矩阵和通用函数的更多相关文章

  1. Python数据分析--Numpy常用函数介绍(4)--Numpy中的线性关系和数据修剪压缩

    摘要:总结股票均线计算原理--线性关系,也是以后大数据处理的基础之一,NumPy的 linalg 包是专门用于线性代数计算的.作一个假设,就是一个价格可以根据N个之前的价格利用线性模型计算得出. 前一 ...

  2. Python数据分析--Numpy常用函数介绍(6)--Numpy中与股票成交量有关的计算

    成交量(volume)是投资中一个非常重要的变量,它是指在某一时段内具体的交易数,可以在分时图中绘制,包括日线图.周线图.月线图甚至是5分钟.30分钟.60分钟图中绘制. 股票市场成交量的变化反映了资 ...

  3. Python数据分析--Numpy常用函数介绍(5)--Numpy中的相关性函数

    摘要:NumPy中包含大量的函数,这些函数的设计初衷是能更方便地使用,掌握解这些函数,可以提升自己的工作效率.这些函数包括数组元素的选取和多项式运算等.下面通过实例进行详细了解. 前述通过对某公司股票 ...

  4. Python数据分析--Numpy常用函数介绍(9)--Numpy中几中常见的图形

    在NumPy中,所有的标准三角函数如sin.cos.tan等均有对应的通用函数. 一.利萨茹曲线 (Lissajous curve)利萨茹曲线是一种很有趣的使用三角函数的方式(示波器上显示出利萨茹曲线 ...

  5. Python数据分析--Numpy常用函数介绍(2)

    摘要:本篇我们将以分析历史股价为例,介绍怎样从文件中载入数据,以及怎样使用NumPy的基本数学和统计分析函数.学习读写文件的方法,并尝试函数式编程和NumPy线性代数运算,来学习NumPy的常用函数. ...

  6. Python数据分析--Numpy常用函数介绍(3)

    摘要:先汇总相关股票价格,然后有选择地对其分类,再计算移动均线.布林线等. 一.汇总数据 汇总整个交易周中从周一到周五的所有数据(包括日期.开盘价.最高价.最低价.收盘价,成交量等),由于我们的数据是 ...

  7. Python数据分析--Numpy常用函数介绍(9)-- 与线性代数有关的模块linalg

    numpy.linalg 模块包含线性代数的函数.使用这个模块,可以计算逆矩阵.求特征值.解线性方程组以及求解行列式等.一.计算逆矩阵 线性代数中,矩阵A与其逆矩阵A ^(-1)相乘后会得到一个单位矩 ...

  8. numpy常用函数学习

    目录numpy常用函数学习点乘法线型预测线性拟合裁剪.压缩和累乘相关性多项式拟合提取符号数组杂项点乘法该方法为数学方法,但是在numpy使用的时候略坑.numpy的点乘为a.dot(b)或numpy. ...

  9. python基础31[常用模块介绍]

    python基础31[常用模块介绍]   python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...

随机推荐

  1. SQList基础+ListView基本使用

    今日所学: SQList基础语法 SDList下载地址 SQLite Download Page SQList安装教程SQLite的安装与基本操作 - 极客开发者-博客 ListView用法 没遇到什 ...

  2. PAT1018 锤子剪刀布

    大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入 ...

  3. 使用React实现一个TodoList案例

    1.效果图: 2.项目源码 3.源码 TodoList.js import React, { Component, Fragment } from 'react'; import TodoItem f ...

  4. Python入门-异常处理

    异常处理 #try----else---- 会一起执行 #finally无论如何,最后都会执行 def main(): try: res = 10/2 print("开始执行计算:" ...

  5. PowerBI添加中国地图

    可以直接在添加视觉对象中添加 或者用此方法 样子: 添加形状地图地图的"位置""图例" 然后去http://datav.aliyun.com/portal/sc ...

  6. 正则表达式小技巧,sql中in的字符串处理

    工作中我经常写sql,当写带in的语句时,需要敲好多单引号,逗号,敲写起来容易易出错.因此,我写了一个小工具,处理这种繁琐工作.原理简单,利用正则表达式匹配.替换. 先看界面,一个html页面,包含三 ...

  7. JetBrains Rider C# 学习①

    Rider 发现 Alt+F7 键无效: 把GeForce Experience里的游戏覆盖关闭 前言 C#从入门到精通 链接:https://pan.baidu.com/s/1UveJI_f-c5D ...

  8. Python 读取UCI iris数据集分析、numpy基础学习

    python基础.numpy使用.io读取数据集.数据处理转换与简单分析.读取UCI iris数据集中鸢尾花的萼片.花瓣长度数据,进行数据清理,去重,排序,并求出和.累积和.均值.标准差.方差.最大值 ...

  9. Git上传本地仓库文件到Gitee(Github同理)

    前言:本来想把最近的代码更新到Github上,但是校园网打不开,于是决定暂时先更新到Gitee中,Github中的操作也同理. 1. 创建云仓库: 就是在Gitee/Github上创建仓库,这里不演示 ...

  10. Java学习day14

    可变参数用作方法的形参,方法参数的个数就可变 格式:修饰符 返回值类型 方法名(数据类型...变量名){ } 方法内的形参只能有一个,这里的变量是一个数组 public static <T> ...