Numpy学习笔记——矩阵和通用函数
来源:互联网 发布:js cookie 永不过期 编辑:程序博客网 时间:2024/05/29 08:18
5.1 矩阵
在NumPy中,矩阵是ndarray的子类,可以由专用的字符串格式来创建,使用mat、matrix以及bmat函数来创建矩阵。
5.2 动手实践:创建矩阵
在创建矩阵的专用字符串中,矩阵的行与行之间用分号隔开,行内的元素之间用空格隔开:
A = np.mat('1 2 3; 4 5 6; 7 8 9')print "Creation from string", A
使用NumPy数组进行创建:
print "Creation from array", np.mat(np.arange(9).reshape(3, 3))
用T属性获取转置矩阵:
print "transpose A", A.T
用I属性获取逆矩阵:
print "Inverse A", A.I
5.3 从已有矩阵创建新矩阵
用bmat函数来实现。这里的b表示“分块”,bmat即分块矩阵(block matrix)。
创建一个2×2的单位矩阵:
A = np.eye(2)print "A", AB = 2 * Aprint "B", B
使用字符串创建复合矩阵,该字符串的格式与mat函数中一致:
print "Compound matrix\n", np.bmat("A B; A B")
5.5 通用函数
def ultimate_answer(a): result = np.zeros_like(a) result.flat = 42 return result
使用frompyfunc创建通用函数。指定输入参数的个数为1,随后的1为输出参数的个数:
ufunc = np.frompyfunc(ultimate_answer, 1, 1)print "The answer", ufunc(np.arange(4))print "The answer", ufunc(np.arange(4).reshape(2, 2))
5.7 通用函数的方法
通用函数有四个方法,不过这些方法只对输入两个参数、输出一个参数的ufunc对象有效,例如add函数。
reduce
accumulate
reduceat
outer
沿着指定的轴,在连续的数组元素之间递归调用通用函数,即可得到输入数组的规约(reduce)计算结果。对于add函数,其对数组的reduce计算结果等价于对数组元素求和:
a = np.arange(9)print "Reduce", np.add.reduce(a)
accumulate方法同样可以递归作用于输入数组。但是与reduce方法不同的是,它将存储运算的中间结果并返回。因此在add函数上调用accumulate方法,等价于直接调用cumsum函数:
print "Accumulate", np.add.accumulate(a)# Accumulate [ 0 1 3 6 10 15 21 28 36]
第一步用到索引值列表中的0和5,实际上就是对数组中索引值在0到5之间的元素进行reduce操作。
第二步用到索引值5和2。由于2比5小,所以直接返回索引值为5的元素。
第三步用到索引值2和7。这一步是对索引值在2到7之间的数组元素进行reduce操作。
第四步用到索引值7。这一步是对索引值从7开始直到数组末端的元素进行reduce操作。
print "Reduceat", np.add.reduceat(a, [0, 5, 2, 7])# Reduceat [10 5 20 15]
outer方法返回一个数组,它的秩(rank)等于两个输入数组的秩的和。它会作用于两个输入数组之间存在的所有元素对。
print "Outer", 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]]
5.9 算术运算
在NumPy中,基本算术运算符+、-和*隐式关联着通用函数add、subtract和multiply.在数组的除法运算中涉及三个通用函数divide、true_divide和
floor_division,以及两个对应的运算符/和//。
divide函数在整数和浮点数除法中均只保留整数部分:
a = np.array([2, 6, 5])b = np.array([1, 2, 3])print "Divide", np.divide(a, b), np.divide(b, a)# Divide [2 3 1] [0 0 0]
true_divide函数与数学中的除法定义更为接近,即返回除法的浮点数结果而不作截断:
print "True Divide", np.true_divide(a, b), np.true_divide(b, a)
floor_divide函数总是返回整数结果,相当于先调用divide函数再调用floor函数。
floor函数将对浮点数进行向下取整并返回整数:
print "Floor Divide", np.floor_divide(a, b), np.floor_divide(b, a) c = 3.14 * bprint "Floor Divide 2", np.floor_divide(c, b), np.floor_divide(b, c)
默认情况下,使用/运算符相当于调用divide函数:
from__future__import division
但如果在Python程序的开头有上面那句代码,则改为调用true_divide函数
print "/ operator", a/b, b/a
运算符//对应于floor_divide函数
print "// operator", a//b, b//aprint "// operator 2", c//b, b//c
5.11 模运算
计算模数或者余数,可以使用NumPy中的mod、remainder和fmod函数。当然,也可以使用%运算符。这些函数的主要差异在于处理负数的方式。fmod函数在这方面异于其他函数。
remainder函数逐个返回两个数组中元素相除后的余数。如果第二个数字为0,则直接返回0:
a = np.arange(-4, 4)print "Remainder", np.remainder(a, 2)
mod函数与remainder函数的功能完全一致:
print "Mod", np.mod(a, 2)
%操作符仅仅是remainder函数的简写:
print "% operator", a % 2
fmod函数处理负数的方式与remainder、mod和%不同。所得余数的正负由被除数决定,与除数的正负无关:
print "Fmod", np.fmod(a, 2)
5.13 斐波那契数列
使用matrix函数创建矩阵,rint函数对浮点数取整,但结果仍为浮点数类型。
F = np.matrix([[1, 1], [1, 0]])print "8th Fibonacci", (F ** 7)[0, 0]
利用黄金分割公式或通常所说的比奈公式(Binet’ s Formula),加上取整函数,就可以直接计算斐波那契数:
n = np.arange(1, 9)sqrt5 = np.sqrt(5)phi = (1 + sqrt5)/2fibonacci = np.rint((phi**n - (-1/phi)**n)/sqrt5)
5.15 利萨茹曲线
利萨茹曲线由以下参数方程定义:
x = A sin(at + n/2)
y = B sin(bt)
a = float(sys.argv[1])b = float(sys.argv[2])t = np.linspace(-np.pi, np.pi, 201)x = np.sin(a * t + np.pi/2)y = np.sin(b * t)plot(x, y)show()
5.17 方波
方波可以近似表示为多个正弦波的叠加。事实上,任意一个方波信号都可以用无穷傅里叶级数来表示。
t = np.linspace(-np.pi, np.pi, 201)k = np.arange(1, float(sys.argv[1]))k = 2 * k - 1f = np.zeros_like(t)#对于一个数组中每个元素都进行的计算,可以直接像使用变量一样,直接对数组做计算就可以了for i in range(len(t)): f[i] = np.sum(np.sin(k * t[i])/k)f = (4 / np.pi) * fplot(t, f)show()
5.19 锯齿波和三角波
t = np.linspace(-np.pi, np.pi, 201)k = np.arange(1, float(sys.argv[1]))f = np.zeros_like(t)# 可以改进为不使用循环语句for i in range(len(t)): f[i] = np.sum(np.sin(2 * np.pi * k * t[i])/k)f = (-2 / np.pi) * fplot(t, f, lw=1.0)plot(t, np.abs(f), lw=2.0)show()
5.21 位操作函数和比较函数
第一个小技巧需要用XOR或者^操作符。XOR操作符又被称为不等运算符,因此当两个操作数的符号不一致时,XOR操作的结果为负数。在NumPy中,
^ 操作符对应于bitwise_xor函数,
< 操作符对应于less函数。
& 操作符对应于bitwise_and函数,
== 操作符对应于equal函数。
<< 操作符对应于left_shift函数。
x = np.arange(-9, 9)y = -xprint "Sign different?", (x ^ y) < 0print "Sign different?", np.less(np.bitwise_xor(x, y), 0)print "Power of 2?\n", x, "\n", (x & (x - 1)) == 0print "Power of 2?\n", x, "\n", np.equal(np.bitwise_and(x, (x - 1)), 0)print "Modulus 4\n", x, "\n", x & ((1 << 2) - 1)print "Modulus 4\n", x, "\n", np.bitwise_and(x, np.left_shift(1, 2) - 1)
- Numpy学习笔记——矩阵和通用函数
- numpy矩阵和通用函数
- Numpy学习笔记之ndarray通用函数
- Numpy学习笔记——常用函数
- Numpy学习笔记——便捷函数
- 【python学习笔记】18:numpy数组函数与矩阵运算
- Numpy学习笔记——Numpy基础
- Numpy学习笔记——NumPy模块
- 《numpy学习指南》学习笔记——常用函数
- numpy学习笔记1—ravel() 和 flatten()
- numpy矩阵运算和常用函数
- NumPy学习笔记(2)--Array数组和矩阵基本运算
- NumPy学习笔记(2)--Array数组和矩阵基本运算
- Numpy库学习—squeeze()函数
- 初识Numpy——矩阵
- 《numpy学习指南》学习笔记——数组
- numpy基础教程—矩阵的简单属性和方法
- Numpy学习笔记4-常用函数
- python基础——面向对象
- 代码整洁_迭进
- Codeforces 846 B MAth Show
- 移植程序步骤及注意点(keil5)
- Python学习笔记day05
- Numpy学习笔记——矩阵和通用函数
- 基于SRAM的内存管理
- 进程和线程定义,概念,区别详解
- ASP.NET MVC上传文件
- aardio学习记录-1.基本概念和自定义类的调用
- 突发事件属性库构建
- J2EE进阶之ajax和JSon使用 二十三
- BFS:UVa220 ACM/ICPC 1992-Othello(黑白棋)
- D