numpy基础及常用方法

本文简单列举了numpy中常见的一些方法,主要分为两部分:

  • 简单介绍数组操作
  • 线性代数部分

创建数组方法:

1
np.array([[1, 2, 3, 4], [5, 6, 7, 8]])  #多维数组的生成
1
2
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
1
2
3
4
a = np.arange(0,10,1)
b = np.linspace(0,10,20,endpoint=True) #0到10,共20个数的等差数列
c = np.logspace(0,2,10,base=2) #10^0到10^2,共10个数的等比数列,基值可选,默认为10
print(a,b,c)
1
2
3
4
5
6
7
(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
array([ 0. , 0.52631579, 1.05263158, 1.57894737, 2.10526316,
2.63157895, 3.15789474, 3.68421053, 4.21052632, 4.73684211,
5.26315789, 5.78947368, 6.31578947, 6.84210526, 7.36842105,
7.89473684, 8.42105263, 8.94736842, 9.47368421, 10. ]),
array([1. , 1.16652904, 1.36079 , 1.58740105, 1.85174942,
2.16011948, 2.5198421 , 2.93946898, 3.42897593, 4. ]))

其余的创建函数:ones, zeros, empty, eye

从字节序列创建数组:

1
2
s = '1 2 3 4 5 6 7 8 9'
np.fromstring(s,dtype=int,sep=' ')
1
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
1
2
s = '1,2,3,4,5,6,7,8,9'
np.fromstring(s,dtype=int,sep=',')
1
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

从函数创建数组:

1
2
3
4
5
def func(i):
return(i**2)

np.fromfunction(func,(10,),dtype=float)
#创建函数可附加类型:np.int,np.float,np.complex,np.bool,np.string
1
array([ 0.,  1.,  4.,  9., 16., 25., 36., 49., 64., 81.])

类型转换函数:

1
2
x = np.array([1, 2, 2.5])
print(x,x.astype(int))
1
[1.  2.  2.5] [1 2 2]

数组重塑:

强制修改数组arr的尺寸:

1
2
3
4
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 1, 2]])
print(arr,arr.shape)
arr.shape = 3, 4
print(arr,arr.shape)
1
2
3
4
5
6
7
[[1 2 3]
[4 5 6]
[7 8 9]
[0 1 2]] (4, 3)
[[1 2 3 4]
[5 6 7 8]
[9 0 1 2]] (3, 4)
1
2
3
a = np.arange(6).reshape((3,2))
print(a)
np.reshape(a,(2, 3))
1
2
3
[[0 1]
[2 3]
[4 5]]
1
2
3
#使用reshape方法创建新尺寸数组,原数组尺寸不变,但reshape方法共享数据
new_arr = a.reshape((2, 3))
new_arr
1
2
array([[0, 1, 2],
[3, 4, 5]])

数组索引切片及转置:

方法与列表操作相同,但通过下标范围获取的新数组和原数组共享同一块数据空间,可用arr[1:3].copy()得到副本。

索引还包括:
​ - 布尔型索引:可进行筛选操作,例:data[data<0] = 0 #data数组中小于0的数据置0
​ - 花式索引

1
2
3
x = np.array([[1, 2], [3, 4], [5, 6]])
print(x)
print(x.T)
1
2
3
4
5
[[1 2]
[3 4]
[5 6]]
[[1 3 5]
[2 4 6]]

一元通用函数:

1
2
3
4
5
6
7
8
9
10
11
arr = np.array([1, 2, 3, 4.6, 5.4])
print('fabs():总是返回float类型,对于非复数值fabs更快','\n',np.fabs(arr))
print('log():求ln(x)','\n',np.log(arr))
print('log10():求lg(x)','\n',np.log10(arr))
print('log2():求log2(x)','\n',np.log2(arr))
print('log1p():求ln(1+x)','\n',np.log1p(arr))
print('sign():符号函数','\n',np.sign(arr))
print('ceil():天花板函数','\n',np.ceil(arr))
print('floor():地板函数','\n',np.floor(arr))
print('rint():四舍五入函数,保留dtype','\n',np.rint(arr))
print('modf():前者小数部分,后者整数部分','\n',np.modf(arr))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fabs():总是返回float类型,对于非复数值fabs更快 
[1. 2. 3. 4.6 5.4]
log():求ln(x)
[0. 0.69314718 1.09861229 1.5260563 1.68639895]
log10():求lg(x)
[0. 0.30103 0.47712125 0.66275783 0.73239376]
log2():求log2(x)
[0. 1. 1.5849625 2.20163386 2.43295941]
log1p():求ln(1+x)
[0.69314718 1.09861229 1.38629436 1.7227666 1.85629799]
sign():符号函数
[1. 1. 1. 1. 1.]
ceil():天花板函数
[1. 2. 3. 5. 6.]
floor():地板函数
[1. 2. 3. 4. 5.]
rint():四舍五入函数,保留dtype
[1. 2. 3. 5. 5.]
modf():前者小数部分,后者整数部分
(array([0. , 0. , 0. , 0.6, 0.4]), array([1., 2., 3., 4., 5.]))

未列出的函数还有:

  1. 各种三角函数(sin, cos, tan, arcsin, arccos, arctan…)
  2. 各种逻辑运算函数(logical_and, logical_or, logical_not)
  3. 绝对值,开平方,平方(square),exp等等

二元通用函数:

1
2
3
4
5
6
7
8
9
10
11
12
x = np.array([0, 1, 2, 3, 4])
y = np.array([5, 6, 7, 8, 9])
print('add():','\n',np.add(x,y))
print('subtract():','\n',np.subtract(x,y))
print('multiply():','\n',np.multiply(x,y))
print('divide():','\n',np.divide(x,y))
print('floor_divide():','\n',np.floor_divide(x,y))
print('power():','\n',np.power(x,y))
print('maximum():','\n',np.maximum(x,y))
print('fmax():忽略NaN','\n',np.fmax(x,y))
print('mod():x/y的余数','\n',np.mod(x,y))
print('copysign():y的符号copy to x','\n',np.copysign(x,y))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
add(): 
[ 5 7 9 11 13]
subtract():
[-5 -5 -5 -5 -5]
multiply():
[ 0 6 14 24 36]
divide():
[0. 0.16666667 0.28571429 0.375 0.44444444]
floor_divide():
[0 0 0 0 0]
power():
[ 0 1 128 6561 262144]
maximum():
[5 6 7 8 9]
fmax():忽略NaN
[5 6 7 8 9]
mod():x/y的余数
[0 1 2 3 4]
copysign():y的符号copy to x
[0. 1. 2. 3. 4.]

除此之外,还有一系列逻辑函数:

  • greater
  • greater_equal
  • less
  • less_equal
  • logical_and
  • logical_not
  • logical_xor

矩阵乘法三种方式:

  1. x.dot(y)
  2. np.dot(x,y)
  3. x @ y
1
2
3
4
5
x = np.array([[1, 2], [3, 4]])
y = np.array([[5, 6], [7, 8]])
print(x.dot(y))
print(np.dot(x,y))
print(x @ y)
1
2
3
4
5
6
[[19 22]
[43 50]]
[[19 22]
[43 50]]
[[19 22]
[43 50]]

常用的linalg函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
from numpy import linalg as LA
# from numpy.linalg import ...

x = np.array([[1, 2], [3, 4]])
a = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
print(x)
print('对角元素和:',x.trace())
print('矩阵行列式:',LA.det(x))
print('前者特征值,后者特征向量:','\n',LA.eig(x))
print('求逆:','\n',LA.inv(x))
print('解方程组:',LA.solve(a,b))
print('检验结果正确性:',np.allclose(np.dot(a,LA.solve(a,b)),b))
1
2
3
4
5
6
7
8
9
10
11
12
[[1 2]
[3 4]]
对角元素和: 5
矩阵行列式: -2.0000000000000004
前者特征值,后者特征向量:
(array([-0.37228132, 5.37228132]), array([[-0.82456484, -0.41597356],
[ 0.56576746, -0.90937671]]))
求逆:
[[-2. 1. ]
[ 1.5 -0.5]]
解方程组: [2. 3.]
检验结果正确性: True