1.multiply
对应位置元素相乘。
import numpy as np
x1 = [1, 2, 3]
x2 = [4, 5, 6]
np.multiply(x1, x2)
array([ 4, 10, 18])
2.std 标准方差 ,var 方差
b = [1, 3, 5, 6]
np.var(b)
3.6875
np.std(b)
1.920286436967152
np.power(np.std(b), 2)
3.6874999999999996
c = [[1, 2, 3, 4, 5, 6],
[3, 4, 5, 6, 7, 8]]
np.var(c[0]) # 全部元素求方差
2.9166666666666665
np.var(c, 0) # 按列求方差
array([1., 1., 1., 1., 1., 1.])
np.var(c, 1) # 按行求方差
array([2.91666667, 2.91666667])
3.mean
x = [1, 3, 5, 6]
np.mean(x)
3.75
np.mean(c) #全部元素求均值
4.5
np.mean(c, 0) # 按列求均值
array([2., 3., 4., 5., 6., 7.])
np.mean(c, 1) # 按行求均值
array([3.5, 5.5])
4.sum
求向量的和。也可以求矩阵所有元素的和
x = [[0, 1, 2],
[2, 1, 0]]
b = [1, 3, 5, 6]
np.sum(x)
6
np.sum(b)
15
5.cov() (样本协方差 )
https://zh.wikipedia.org/wiki/协方差矩阵
b = [1, 3, 5, 6]
np.cov(b)
array(4.91666667)
np.sum(
(np.multiply(b, b)) - np.mean(b) * np.mean(b)
)/3
4.916666666666667
x = [[0, 1, 2],
[2, 1, 0]]
np.cov(x)
array([[ 1., -1.],
[-1., 1.]])
np.sum(
(np.multiply(x[0],x[1])) - np.mean(x[0])*np.mean(x[1])
)/2
-1.0
6.corrcoef
该函数得到相关系数矩阵。
vc = [1, 2, 39, 0, 8]
vb = [1, 2, 38, 0, 8]
np.mean(np.multiply((vc - np.mean(vc)),(vb - np.mean(vb))))/( np.std(vb) * np.std(vc) )
0.999986231330961
#corrcoef得到相关系数矩阵(向量的相似程度)
np.corrcoef(vc,vb)
array([[1. , 0.99998623],
[0.99998623, 1. ]])
相关系数公式:
7.vdot 向量的点积 ,对应位置相乘求和
l1 = [1, 2, 3]
l2 = [4, 5, 6]
np.vdot(l1, l2)
32
8.mat,列表转换成矩阵形式。这在矩阵运算中不可缺少。
l1 = [1, 2, 3]
l2 = [4, 5, 6]
ll = [l1, l2]
np.vdot(l1, l2)
32
np.mat(l1) * np.mat(l2).T
matrix([[32]])
np.mat(ll)
matrix([[1, 2, 3],
[4, 5, 6]])
9.shape,返回矩阵的行列数
#矩阵有一个shape属性,是一个(行,列)形式的元组
a = np.array([[1,2,3],[4,5,6]])
a.shape
(2, 3)
10.ones ,返回指定行列数的全一矩阵
# 返回按要求的矩阵
ones = np.ones((3, 3))
ones
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
11.xrange
for i in range(3):
print(i)
test = [1, 2, 3, 4]
print(test[:])
0
1
2
[1, 2, 3, 4]
print(test[2:3])
[3]
for i in range(2, 5):
print(i)
2
3
4
test[:]则表示获取test列表中的所有元素。
test[2:3]则表示获取从第2个位置到第三个位置间的元素。
12.strptime
import time
from datetime import datetime, date
dd = datetime.strptime('2014-04-03T10:53:49.8752', '%Y-%m-%dT%H:%M:%S.%f')
print(time.mktime(dd.timetuple()))
1396493629.0
strptime把时间按照指定的格式转换。处理时间的时候会用到这个函数。
13.tuple和数组转换成字符串
tuple = (1, 2, 3)
print(tuple[len(tuple) - 1])
3
tuple[-1]
3
14.transpose和.T
aa = [[1], [2], [3]]
aa = np.mat(aa)
aa
matrix([[1],
[2],
[3]])
aa.transpose()
matrix([[1, 2, 3]])
aa
matrix([[1],
[2],
[3]])
aa.T
matrix([[1, 2, 3]])
aa
matrix([[1],
[2],
[3]])
15.zeros() ones()
np.zeros((3, 3))
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
np.ones((3, 3))
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
16.列表 数组 linspace
li = [1, 2, 3, 4]
print(li)
[1, 2, 3, 4]
arr = np.array(li)
arr
array([1, 2, 3, 4])
np.linspace(0, 3, 6)
array([0. , 0.6, 1.2, 1.8, 2.4, 3. ])
数组中间元素没有分隔符。列表逗号分割。
linspace返回的是指定的开始结束位置的指定个数的数。
17.argsort 排序索引
#数组的构建问题,初始化使用array()
arr = np.array(np.zeros(4))
arr
array([0., 0., 0., 0.])
arr[0] = 0.1
arr[1] = 0.6
arr[2] = 0.5
arr[3] = 0.7
#有-号,降序排列
#无-号,升序排列
sortindex = np.argsort(arr)
for id in sortindex:
print('索引:', id)
for i in arr:
print(i)
索引: 0
索引: 2
索引: 1
索引: 3
0.1
0.6
0.5
0.7
argsort函数返回数组按照从小到大排序的位置的索引。
sortindex = np.argsort(-arr)
for id in sortindex:
print('索引:', id )
for i in sortindex:
print(arr[i])
索引: 3
索引: 1
索引: 2
索引: 0
0.7
0.6
0.5
0.1
18. [:,:]矩阵元素切片
# 获取矩阵元素
li = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
# 获取第二行第0个元素
np.mat(li)[2, 0]
7
#第一个冒号代表获取行的起止行号
#第二个冒号代表获取列的起止行号
np.mat(li)[:,:]
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
19.diag , 构建对角矩阵
# 构建对角阵
# diag()参数为列表即可
dd = [1, 2, 3]
diaggg = np.diag(dd)
print('diag:', diaggg)
diag: [[1 0 0]
[0 2 0]
[0 0 3]]
dd = [1, 2, 3]
diaggg = np.diag(dd)
print('diag:', diaggg)
diag: [[1 0 0]
[0 2 0]
[0 0 3]]
20.linalg.inv和.I 求逆矩阵
dd = [1, 2, 3]
diaggg = np.diag(dd)
diaggg
array([[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])
np.linalg.inv(diaggg)
array([[1. , 0. , 0. ],
[0. , 0.5 , 0. ],
[0. , 0. , 0.33333333]])
np.mat(diaggg).I
matrix([[1. , 0. , 0. ],
[0. , 0.5 , 0. ],
[0. , 0. , 0.33333333]])
# 求逆矩阵
li = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
lv = np.linalg.inv(np.mat(li))
lv
matrix([[ 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]])
# 求逆矩阵
np.mat(li).I
matrix([[ 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]])
上面求逆矩阵有两种方式。 linalg.inv()和 矩阵.I 。两种方式均可。
21.dot矩阵点积
li = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
ld = np.dot(li, li)
ld
array([[ 30, 36, 42],
[ 66, 81, 96],
[102, 126, 150]])
22.eye 单元矩阵
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
23. eig 矩阵的特征值和特征向量
A = np.mat([
[1,0,0,0,2],
[0,0,3,0,0],
[0,0,0,0,0],
[0,4,0,0,0]
])
U = A * A.T
lamb, hU = np.linalg.eig(U)
print(hU)
print(''.center(20,'-'))
print(lamb)
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
--------------------
[ 5. 9. 0. 16.]
24 .sorted 排序
li = [8, 0, 3, 6, 1, 0, 5, 3, 8, 9]
sorted(li, reverse = True) # 降序
[9, 8, 8, 6, 5, 3, 3, 1, 0, 0]
sorted(li, reverse = False) # 升序
[0, 0, 1, 3, 3, 5, 6, 8, 8, 9]
25.linalg.svd 奇异值分解
A = np.mat([
[1,0,0,0,2],
[0,0,3,0,0],
[0,0,0,0,0],
[0,4,0,0,0]
])
U, S, VT = np.linalg.svd(A)
U
matrix([[ 0., 0., 1., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 0., -1.],
[ 1., 0., 0., 0.]])
S
array([4. , 3. , 2.23606798, 0. ])
VT
matrix([[-0. , 1. , 0. , 0. , 0. ],
[-0. , 0. , 1. , 0. , 0. ],
[ 0.4472136 , 0. , 0. , 0. , 0.89442719],
[ 0. , 0. , 0. , 1. , 0. ],
[-0.89442719, 0. , 0. , 0. , 0.4472136 ]])
U * (np.mat(np.diag(S)) * np.eye(4, 5)) * VT
matrix([[1., 0., 0., 0., 2.],
[0., 0., 3., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 4., 0., 0., 0.]])
26.random.rand
A = np.mat([
[1,0,0,0,2],
[0,0,3,0,0],
[0,0,0,0,0],
[0,4,0,0,0]])
A[:, 1]
matrix([[0],
[0],
[0],
[4]])
# 获取3*3个0-1之间的数字
rr = np.random.rand(3, 3)
rr
array([[0.64614279, 0.77799642, 0.5023505 ],
[0.63227228, 0.84713943, 0.5859797 ],
[0.97261844, 0.17905887, 0.930699 ]])
rr - 0.5
array([[ 0.14614279, 0.27799642, 0.0023505 ],
[ 0.13227228, 0.34713943, 0.0859797 ],
[ 0.47261844, -0.32094113, 0.430699 ]])
2 * (rr - 0.5)
array([[ 0.29228559, 0.55599284, 0.00470101],
[ 0.26454456, 0.69427886, 0.1719594 ],
[ 0.94523687, -0.64188226, 0.86139799]])
27.arange
# arange获取指定起始位置,指定步长的一系列数。
delta = 0.25
x = np.arange(-3.0, 3.0, delta)
x
array([-3. , -2.75, -2.5 , -2.25, -2. , -1.75, -1.5 , -1.25, -1. ,
-0.75, -0.5 , -0.25, 0. , 0.25, 0.5 , 0.75, 1. , 1.25,
1.5 , 1.75, 2. , 2.25, 2.5 , 2.75])
28.nonzero()
nonzero()函数返回矩阵中非0元素的位置
nz的返回值意义如下:
第一行是所有非零数所在行值
第二行是所有非零值所在列值
x = [[1, 0, 0, 0, 2],
[0, 0, 3, 0, 0]]
print(x)
[[1, 0, 0, 0, 2], [0, 0, 3, 0, 0]]
nz = np.nonzero(x)
print(nz)
(array([0, 0, 1], dtype=int64), array([0, 4, 2], dtype=int64))
非零元素x[0,0], x[0, 4], x[1, 2]得到上述结果
print(x[0][0], x[0][4], x[1][2])
1 2 3
print(nz[0])
[0 0 1]
29.获取指定位置的元素
A = np.mat([
[1,0,0,0,2],
[0,0,3,0,0],
[0,0,0,0,0],
[0,4,0,0,0]])
sample = A[0, :] # 获取第0行的所有元素
sample
matrix([[1, 0, 0, 0, 2]])
sample[0]
matrix([[1, 0, 0, 0, 2]])
sample = A[:, 2] # 获取第3列的所有元素
sample
matrix([[0],
[3],
[0],
[0]])
第二个例子:
A = np.mat([
[1,0,0,0,2],
[0,0,3,0,0],
[0,0,0,0,0],
[0,4,0,0,0]])
# 根据ind序列索引获取矩阵A中的数据
ind = [2, 1, 3, 0]
print(A[ind, 0])
[[0]
[0]
[0]
[1]]
30.zip
[1, 2, 3] + [4 , 5, 6]
[1, 2, 3, 4, 5, 6]
np.array([1, 2, 3]) + np.array([4, 5, 6])
array([5, 7, 9])
注意二者区别
li = [1, 2, 3, 4, 5, 6]
# 可以互换指定区域的位置
print(li[3:6] + li[0:3])
[4, 5, 6, 1, 2, 3]
# 成对获取x,y的值
l1 = [1, 2, 3]
l2 = [4, 5, 6]
for x, y in zip(l1, l2):
print(x, y)
1 4
2 5
3 6
31.chr函数,获取指定的字符
for i in range(65, 70):
print(str(chr(i)))
A
B
C
D
E
li = ['a', 'b', 'c', 'd', 'e']
for i in li:
print(ord(i))
97
98
99
100
101
def chrs(strings):
list = []
for i in range(len(strings)):
list.append(ord(strings[i]))
return list
msg = chrs('情人节快乐')
print(msg)
[24773, 20154, 33410, 24555, 20048]
def chrs(num_list):
string = ''
for i in num_list:
string += chr(i)
return string
msg = chrs([24773, 20154, 33410, 24555, 20048])
print(msg)
情人节快乐
32.random.shuffle
shuffle函数随机打乱列表中的元素顺序
li = [0, 1, 2, 3, 4, 5, 6, 7, 8] # 返回列表
li
[0, 1, 2, 3, 4, 5, 6, 7, 8]
#shuffle函数随机打乱列表中的元素顺序
np.random.shuffle(li)
li
[3, 6, 7, 0, 1, 5, 4, 8, 2]
33.vdot 点积
# 返回两向量的点积
l1 = [1, 2, 3]
l2 = [4, 5, 6]
li = [l1, l2]
np.vdot(l1, l2)
32
np.dot(l1, l2)
32
np.mat(l1) * np.mat(l2).T
matrix([[32]])
np.mat(li)
matrix([[1, 2, 3],
[4, 5, 6]])
vdot 和 dot都可以获取向量的点积。
区别:
li = [
[1, 2, 3],
[4, 5, 6],
[1, 2, 3]
]
np.dot(np.mat(li), np.mat(li).T)
matrix([[14, 32, 14],
[32, 77, 32],
[14, 32, 14]])
li = [
[1, 2, 3],
[4, 5, 6],
[1, 2, 3]
]
print(np.mat(li))
print(np.vdot(np.mat(li), np.mat(li)))
[[1 2 3]
[4 5 6]
[1 2 3]]
[[1]]
34.次方计算**
print( 3*2**2)
print( 3*2**0.5)
print( (3*2)**2)
print ((3*2)**0.5)
12
4.242640687119286
36
2.449489742783178
可见 **次方计算优先级要高!
35.max函数
ll=[3,4,6,2,89,9,3,2]
print(max(ll))
l2=[[3,4,6,2,89,9,3,2],[3,6,7,8,983,3,5,6]]
print(max(l2[0]))
print(max(l2))
89
89
[3, 6, 7, 8, 983, 3, 5, 6]
36.mgrid函数
# 开始值,结束值,步长。如果步长为虚数,表示产生的个数长度
print(np.mgrid[-5:5:3j])
[-5. 0. 5.]
print(np.mgrid[-5:5:3])
[-5 -2 1 4]
print(np.mgrid[-5:5:3j, -5:5:3j])
[[[-5. -5. -5.]
[ 0. 0. 0.]
[ 5. 5. 5.]]
[[-5. 0. 5.]
[-5. 0. 5.]
[-5. 0. 5.]]]
print(np.mgrid[-5:5:3,-5:5:3])
[[[-5 -5 -5 -5]
[-2 -2 -2 -2]
[ 1 1 1 1]
[ 4 4 4 4]]
[[-5 -2 1 4]
[-5 -2 1 4]
[-5 -2 1 4]
[-5 -2 1 4]]]
mgrid函数说明:开始值,结束值,步长。
如果步长为虚数,表示产生的个数长度。对照结果即可知道函数的功能。
37.ogrid函数
np.ogrid[-5:5:3j]
array([-5., 0., 5.])
np.ogrid[-5:5:3]
array([-5, -2, 1, 4])
np.ogrid[-5:5:3j,-5:5:3j]
[array([[-5.],
[ 0.],
[ 5.]]), array([[-5., 0., 5.]])]
np.ogrid[-5:5:3,-5:5:3]
[array([[-5],
[-2],
[ 1],
[ 4]]), array([[-5, -2, 1, 4]])]
ogrid跟mgrid一样。不同的是,一个数矩阵,一个数组形式。第三个擦数如果是实数,说明是步长。如果是虚数,说明是个数。
ogrid[-5:5:3,-5:5:3]第一部分产生多行一列,第二部分产生一行多列。这与mgrid不同。
38.random函数
np.random.seed(1)
#要每次产生随机数相同就要设置种子,
# 相同种子数的Random对象,
# 相同次数生成的随机数字是完全相同的
np.random.uniform(-1, 1, 5)
# 用于生成一个指定范围内的随机符点数
array([-0.16595599, 0.44064899, -0.99977125, -0.39533485, -0.70648822])
np.random.random()
0.0923385947687978
np.random.random(5)
array([0.18626021, 0.34556073, 0.39676747, 0.53881673, 0.41919451])
np.random.rand(2, 3) #2行3列
array([[0.6852195 , 0.20445225, 0.87811744],
[0.02738759, 0.67046751, 0.4173048 ]])
# 用于生成一个指定范围内的整数。
# 其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b
np.random.randint(5, 10)
6
np.random.randint(5, 10, size = (5, 5))
array([[6, 5, 6, 6, 6],
[6, 5, 9, 6, 5],
[5, 8, 7, 6, 5],
[8, 6, 6, 8, 9],
[5, 6, 8, 9, 7]])
39.tofile、fromfile
a = np.arange(0, 12)
a.shape = 3, 4
a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
a.tofile('./data/a.bin')
b = np.fromfile('./data/a.bin', dtype = float) # 按照float类型读入数据
b
array([2.12199579e-314, 6.36598737e-314, 1.06099790e-313, 1.48539705e-313,
1.90979621e-313, 2.33419537e-313])
数据不对,查看a的数据类型
a.dtype
dtype('int32')
b = np.fromfile('./data/a.bin', dtype = int) # 按照float类型读入数据
b
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
b.shape = 3, 4
b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
使用数组的方法函数tofile可以方便地将数组中数据以二进制的格式写进文件。
tofile输出的数据没有格式,因此用numpy.fromfile读回来的时候需要自己格式化数据。
Note:
- 读入的时候设置正确的dtype和shape才能保证数据一致。
并且tofile函数不管数组的排列顺序是C语言格式的还是Fortran语言格式的,统一使用C语言格式输出。
- sep关键字参数:
此外如果fromfile和tofile函数调用时指定了sep关键字参数的话,数组将以文本格式输入输出。
{这样就可以通过notepad++打开查看, 不过数据是一行显示,不便于查看}
user_item_mat.tofile(user_item_mat_filename, sep=’’)
40.numpy.load和numpy.save
a = np.arange(0, 12)
a.shape = 3, 4
a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
np.save('./data/a.npy', a)
c = np.load('./data/a.npy')
c
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
numpy.load和numpy.save函数(推荐在不需要查看保存数据的情况下使用)
以NumPy专用的二进制类型保存数据,这两个函数会自动处理元素类型和shape等信息, 使用它们读写数组就方便多了,但是numpy.save输出的文件很难和其它语言编写的程序读入。
Note:
-
文件要保存为.npy文件类型,否则会出错
-
保存为numpy专用二进制格式后,就不能用notepad++打开(乱码)看了,这是相对tofile内建函数不好的一点
numpy.savez函数
如果你想将多个数组保存到一个文件中的话,可以使用numpy.savez函数。savez函数的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为arr_0, arr_1, …。savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个save函数保存的npy文件,文件名对应于数组名。load函数自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容:
如果你用解压软件打开result.npz文件的话,会发现其中有三个文件:arr_0.npy, arr_1.npy, sin_array.npy,其中分别保存着数组a, b, c的内容。
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.arange(0, 1.0, 0.1)
c = np.sin(b)
np.savez("./data/result.npz", a, b, sin_array = c)
r = np.load("./data/result.npz")
r["arr_0"]
array([[1, 2, 3],
[4, 5, 6]])
r["arr_1"]
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
r["sin_array"]
array([0. , 0.09983342, 0.19866933, 0.29552021, 0.38941834,
0.47942554, 0.56464247, 0.64421769, 0.71735609, 0.78332691])
numpy.savetxt和numpy.loadtxt(推荐需要查看保存数据时使用)
Note:savetxt缺省按照’%.18e’格式保存数据, 可以修改保存格式为‘%.8f’(小数点后保留8位的浮点数), ’%d’(整数)等等
总结:
载入txt文件:numpy.loadtxt()/numpy.savetxt()
智能导入文本/csv文件:numpy.genfromtxt()/numpy.recfromcsv()
高速,有效率但numpy特有的二进制格式:numpy.save()/numpy.load()
41.permutation函数
#混淆位置。如果是多维数组,则混淆一维的。例如下面的arr.
np.random.permutation(10)
array([2, 3, 0, 4, 8, 1, 9, 6, 5, 7])
np.random.permutation([1, 4, 9, 12, 15])
array([12, 15, 1, 4, 9])
arr = np.arange(9).reshape((3, 3))
arr
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
np.random.permutation(arr)
array([[3, 4, 5],
[6, 7, 8],
[0, 1, 2]])
42.complex构造复数
np.complex(3, 100)
(3+100j)
43.norm求范数
from scipy.linalg.misc import norm
norm([8, 6, 10])
14.142135623730951
默认情况下,求二范数。也就是各个元素的平方和再开平方。
当然,也可以求取其他范数。例如p范数、无穷范数等。
我这里import写的是scipy。其实numpy里面也有这个函数。详细的其他范数的求法请参考官网
http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.norm.html
内容的介绍。
参考资料:
https://blog.youkuaiyun.com/u010156024/article/details/50419338