numpy包学习笔记

python种numpy包是用于进行矩阵相关的计算,本篇笔记将从矩阵及属性,生成矩阵,访问元素,矩阵运算,矩阵合并,矩阵分割,矩阵赋值七个方面介绍矩阵的基本用法。

1.矩阵与其属性

构建一个numpy矩阵并访问其属性

import numpy as np

array = np.array([[1,2,3],[2,3,4]])  #构建一个二维矩阵
print(array)

##基本属性
print('number of dim',array.ndim) #维度
print('shape:',array.shape) #形状,几行几列
print('size:',array.size) #元素个数

运行结果:

[[1 2 3]
 [2 3 4]]
number of dim 2
shape: (2, 3)
size: 6

ps. 矩阵可分为一维矩阵与二维矩阵

import numpy as np
a = np.array([1,2,3,4])
print(a.ndim)
print(a.shape)
b = np.array([[1,2,3,4]])
print(b.ndim)
print(b.shape)

运行结果:

1
(4,)
2
(1, 4)

2.构建numpy矩阵的方法

a = np.array([2,3,4],dtype=np.int) ###dtype:np.int64 np.int32 np.float64 np.float32 (位数越小占用空间越小,精度越差)
print(a)
print(a.dtype)

a = np.array([[1,2,33],[2,3,44]]) #直接以二维数组的形式生成矩阵
print(a)
a = np.zeros((3,4)) #生成所有元素都是0的矩阵
print(a)
a = np.ones((3,4)) #生成所有元素都是1的矩阵
print(a)
a = np.empty((3,4), dtype=np.float32) #当dtype为float时,每个元素的数值都很小,当dtype为int时,每个元素都为1
print(a)
a = np.arange(10,30,2).reshape((2,5)) #生成序列数的矩阵
print(a)

运行结果:

[2 3 4]
int32
[[ 1  2 33]
 [ 2  3 44]]
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
[[7.071444e-39 7.255112e-39 7.346949e-39 7.255119e-39]
 [7.530610e-39 7.071424e-39 6.704089e-39 6.336756e-39]
 [5.602082e-39 5.326553e-39 7.346969e-39 1.019390e-38]]
[[10 12 14 16 18]
 [20 22 24 26 28]]

3.矩阵的运算

矩阵的运算与R语言中矩阵的运算符号规则类似,但在numpy中矩阵的乘法分为数学乘法和矩阵点乘两种。

a = np.array([10,20,30,40])
b = np.arange(4)

print(a)
print(b)
print('*'*30)
###运算
c = a - b
print('a - b : {0}'.format(c))
c = a + b
print('a + b : {0}'.format(c))
c = b**2 #乘方
print('b^2 : {0}'.format(c))
c = np.sin(a)
print('sin(a) : {0}'.format(c))
print('b < 3 : ',b < 3)
print('b == 3 : ',b==3)

print('\n\n')

a = np.array([[1,1],[0,1]])
b = np.arange(4).reshape((2,2))
print(a)
print(b)
print('*'*30)
c = a * b ###元素一一相乘
print('a * b :\n{0}'.format(c))
c_dot = np.dot(a,b) ###矩阵的乘法,写法等价于 a.dot(b)
print('a . b :\n{0}'.format(c_dot))

print('*'*30)
a = np.random.random((2,4)) ###随机生成一个矩阵,维度为2行4列
print(a)
print('sum:',np.sum(a))
print('sum in row:',np.sum(a,axis=1)) #求行和
print('sum in col:',np.sum(a,axis=0)) #求列和
print('max:',np.max(a))
print('min:',np.min(a))
print('mean:',np.mean(a)) ###等价于 a.mean()
print('average:',np.average(a))

运行结果:

[10 20 30 40]
[0 1 2 3]
******************************
a - b : [10 19 28 37]
a + b : [10 21 32 43]
b^2 : [0 1 4 9]
sin(a) : [-0.54402111  0.91294525 -0.98803162  0.74511316]
b < 3 :  [ True  True  True False]
b == 3 :  [False False False  True]



[[1 1]
 [0 1]]
[[0 1]
 [2 3]]
******************************
a * b :
[[0 1]
 [0 3]]
a . b :
[[2 4]
 [2 3]]
******************************
[[0.53350219 0.21520172 0.46648373 0.32288226]
 [0.78381529 0.71279036 0.38545227 0.7198446 ]]
sum: 4.1399724090944385
sum in row: [1.5380699  2.60190251]
sum in col: [1.31731747 0.92799208 0.851936   1.04272686]
max: 0.7838152868296081
min: 0.21520172072824184
mean: 0.5174965511368048
average: 0.5174965511368048

其他运算方法

A = np.arange(2,14).reshape((3,4))
print(A)

print(np.argmin(A)) ###最小值所在的索引值
print(np.argmax(A))
print(np.median(A))
print(np.cumsum(A)) ###累加值
print(np.diff(A))  ###每两个数之间的差值
print(np.nonzero(A))   ###输出值为非零值的位置,第一个array为行所在的索引,第二个array为列所在的索引
print(np.sort(A)) ###逐行进行排序
print(np.transpose(A)) ###转置
print(A.T)
print(np.clip(A,5,9)) ###截取,A中的数值,小于5的都被替换为5,大于9的都被替换为9

运行结果:

[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]
0
11
7.5
[ 2  5  9 14 20 27 35 44 54 65 77 90]
[[1 1 1]
 [1 1 1]
 [1 1 1]]
(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]
[[ 2  6 10]
 [ 3  7 11]
 [ 4  8 12]
 [ 5  9 13]]
[[ 2  6 10]
 [ 3  7 11]
 [ 4  8 12]
 [ 5  9 13]]
[[5 5 5 5]
 [6 7 8 9]
 [9 9 9 9]]

4.矩阵元素访问--索引

对于一维矩阵,索引方法为在中括号中加上元素所在的位置(相当于R语言种的向量),对于二维矩阵,索引方法为在中括号中以两个数字访问其位置(相当于R语言中的矩阵)。

A = np.arange(3,15)
print(A[3]) ###一维矩阵的索引方法
A = np.arange(3,15).reshape((3,4))
print(A[1][1]) ###二维矩阵的索引方法
print(A[1,1]) ###同上
print(A[2])   ###取出第三行
print(A[2,])  ###同上
print(A[2,:])  ###同上
print(A[:,2])   ###取出第三列
print(A[1:3,1:3])   ###取出某一个子集

###遍历行
print('*'*30)
for row in A:
    print(row)

###遍历列
print('*'*30)
for coloum in A.T:
    print(coloum)
    
###遍历每一个元素
print('*'*30)
print(A.flatten())
for i in A.flat:
    print(i)

运行结果:

6
******************************
[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
8
8
[11 12 13 14]
[11 12 13 14]
[11 12 13 14]
[ 5  9 13]
[[ 8  9]
 [12 13]]
******************************
[3 4 5 6]
[ 7  8  9 10]
[11 12 13 14]
******************************
[ 3  7 11]
[ 4  8 12]
[ 5  9 13]
[ 6 10 14]
******************************
[ 3  4  5  6  7  8  9 10 11 12 13 14]
3
4
5
6
7
8
9
10
11
12
13
14

5.合并矩阵

按行合并:numpy.vstack()

按列合并:numpy.hstack()A = np.array([1,1,1])B = np.array([2,2,2])

A = np.array([1,1,1])
B = np.array([2,2,2])

print(A)
print(B)

###按行合并
C = np.vstack((A,B))
print(C)

###按列合并
D = np.hstack((A,B))
print(D)

#一维矩阵转二维矩阵的方法
print(A.shape)
print(A[np.newaxis,:].shape) ###将一维矩阵的行赋予新的维度
print(A[:,np.newaxis].shape) ###将一行的矩阵的列赋予新的维度
print(A[:,np.newaxis])

A = np.array([1,1,1])[:,np.newaxis]
B = np.array([2,2,2])[:,np.newaxis]
C = np.concatenate((A,B,B,A),axis=1)
print(C)

运行结果:

[1 1 1]
[2 2 2]
[[1 1 1]
 [2 2 2]]
[1 1 1 2 2 2]
(3,)
(1, 3)
(3, 1)
[[1]
 [1]
 [1]]
[[1 2 2 1]
 [1 2 2 1]
 [1 2 2 1]]

6.分割矩阵

numpy.split(MA, num, axis)方法可以将矩阵分割为多个子集,接受三个参数,分别为矩阵名称MA,分割为几部分num,维度axis(1行2列)

numpy.array_split()方法可以将矩阵分割为维度不同的子集

numpy.hsplit():矩阵水平方向分割为不同子集

numpy.vsplit():矩阵垂直方向分割为不同子集

A = np.arange(12).reshape(3,4)
print(A)

print(np.split(A,2,axis=1)) ###将array分割的每一行都分割为两部分,分割的每一部分维度都要相同
print(np.array_split(A,3,axis=1))  ###将array分割的每一行都分割为三部分,分割的每一部分维度可以相同
print(np.hsplit(A,2))   ###将array分割为水平的两个部分
print(np.vsplit(A,3))   ###将array分割为垂直的三个部分

运行结果

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[array([[0, 1],
       [4, 5],
       [8, 9]]), 
array([[ 2, 3], [ 6, 7], [10, 11]])] [array([[0, 1], [4, 5], [8, 9]]),
array([[ 2], [ 6], [10]]),
array([[ 3], [ 7], [11]])] [array([[0, 1], [4, 5], [8, 9]]),
array([[ 2, 3], [ 6, 7], [10, 11]])] [array([[0, 1, 2, 3]]),
array([[4, 5, 6, 7]]),
array([[ 8, 9, 10, 11]])]

7.矩阵的赋值

直接使用A = B的方法,其指向内存中的数据是同一份数据

使用numpy.copy()方法可将矩阵的值复制并产生新的内存地址

A = np.arange(4)
print(A)
B = A
C = A
D = B

print(A,B,C,D)
A[0] = 11
print(A,B,C,D)
###以上这种赋值方法,改变其中一个对象的时候所有对象的值都会改变

print('*'*30)
A = np.arange(4)
B = np.copy(A)
print(A,B)
A[0:3] = [11,22,33]
print(A,B)
###以上这种赋值方法不会改变B的值, deep copy

运行结果:

[0 1 2 3]
[0 1 2 3] [0 1 2 3] [0 1 2 3] [0 1 2 3]
[11  1  2  3] [11  1  2  3] [11  1  2  3] [11  1  2  3]
******************************
[0 1 2 3] [0 1 2 3]
[11 22 33  3] [0 1 2 3]

猜你喜欢

转载自www.cnblogs.com/yeoli/p/10652261.html