Numpy矩阵与通用函数

1.创建矩阵(从源码看出,一般更推荐用mat,更加节省内存。因为matrix用了copy)

impory numpy as np


### 创建矩阵-----二维

##使用mat函数创建矩阵
m1 = np.mat("1 2 3;3 4 5;5 6 7")    ## 空格隔开列,分号隔开行

print(m1)

print(type(m1))


输出结果:

[[1 2 3]
 [3 4 5]
 [5 6 7]]
<class 'numpy.matrix'>

######################################################

m2 = np.mat([[1,2,3],[4,5,6],[7,8,9]])

print(m2)

print(type(m2))

输出结果:

[[1 2 3]
 [4 5 6]
 [7 8 9]]
<class 'numpy.matrix'>

#########################################################

##使用matrix函数创建矩阵

m3 = np.matrix([[1,2,3],[2,3,4],[3,4,5]])

print(m3)

print(type(m3))


输出结果:

[[1 2 3]
 [4 5 6]
 [7 8 9]]
<class 'numpy.matrix'>



2.组合矩阵

import numpy as np

###使用bmat函数合成矩阵

m1 = np.mat("1 2 3;3 4 5;5 6 7")

print("m1:\n",m1)

m2 = np.mat([[1,2,3],[4,5,6],[7,8,9]])

print("m2:\n",m2)

###直接组合矩阵
m3 = np.bmat([[m1,m2],[m2,m1]])
print("m3:\n",m3)

m3 = np.bmat('m1,m2;m2,m1')    ##逗号分开列,分号隔开行。



输出结果:

m1:
[[1 2 3]
 [3 4 5]
 [5 6 7]]

m2:
[[1 2 3]
 [4 5 6]
 [7 8 9]]

m3:
[[1 2 3 1 2 3]
 [3 4 5 4 5 6]
 [5 6 7 7 8 9]
 [1 2 3 1 2 3]
 [4 5 6 3 4 5]
 [7 8 9 5 6 7]]

3.矩阵的运算

import numpy as np

m1 = np.mat([[1,2,3],[2,3,4]])

print('m1:\n',m1)

输出结果:

m1:

[[1 2 3]
 [2 3 4]]

### 对应元素与数相乘

m2 = m1*3

print("m2:\n",m2)


输出结果:

[[ 3  6  9]
 [ 6  9 12]]
#################################################

####矩阵与数相加减(对应元素位置相加减)

m3 = np.mat([[1,1,1],[1,1,1]])

m = m1+m3
print(m)

输出结果:

[[0 1 2]
 [1 2 3]]

###################################################

### 矩阵相乘

## m,n*n,l = m,l  左矩阵列数必须等于右矩阵行数

m1 = np.mat([[1,2,3],[4,5,6]])

m2 = np.mat([[1,2],[1,1],[1,1]])

print(m1)

print(m2)

m3 = m1*m2

print(m3)

输出结果:


[[1 2 3]
 [4 5 6]]

[[1 2]
 [1 1]
 [1 1]]

[[ 6  7]
 [15 19]]

#################################3##
推荐使用matmul,dot

m1 = np.mat([[1,2,3],[4,5,6]])
m2 = np.mat([[1,2],[1,1],[1,1]])

m3 = np.matmul(m1,m2)
m3 = np.dot(m1,m2)

print(m3)


输出结果:

[[ 6  7]
 [15 19]]

####################################################

###矩阵特有的属性

m = np.mat('1 0 3;2 8 4;3 7 5')

print('m',m)
print('m的转置',m.T)   ### 行列互换
print('m的共轭转置',m.H)  ##先共轭再转置
print('m的逆',m.I) ## m* 逆矩阵 = E(单位矩阵)
print('m的视图',m.A)
print('m的视图类型',type(m.A))


输出结果:

m [[1 0 3]
 [2 8 4]
 [3 7 5]]
m的转置 [[1 2 3]
 [0 8 7]
 [3 4 5]]
m的共轭转置 [[1 2 3]
 [0 8 7]
 [3 4 5]]
m的逆 [[-0.66666667 -1.16666667  1.33333333]
 [-0.11111111  0.22222222 -0.11111111]
 [ 0.55555556  0.38888889 -0.44444444]]
m的视图 [[1 0 3]
 [2 8 4]
 [3 7 5]]
m的视图类型 <class 'numpy.ndarray'>

4.ufunc函数

全称通用函数(universal function),是一种能够对数组中所有元素进行操作的函数。
以 Numpy 数组作为输出,因此不需要对数组每个元素都操作,比 math 库中的函数操作效率
更高。

 四则运算:加(+)、减(-)、乘(*)、除(/)、幂(**)。数组间的四则运算表示
对每个数组中的元素分别进行四则运算,所以形状必须相同。
 比较运算:>、<、==、>=、<=、!=。比较运算返回的结果是一个布尔数组,每个元素
为每个数组对应元素的比较结果。
 逻辑运算:np.any 函数表示逻辑“or”,np.all 函数表示逻辑“and”。运算结果返回布尔值。

import numpy as np

### 创建数组

arr1 = np.arange(4).reshape(2,2)

print('arr1:',arr1)

arr2 =  np.array([[1,2],[1,2]])
print('arr2:',arr2)

###加法-----对应元素的相加
arr_new = arr1+arr2
print(arr_new)

####减法----对应元素的相减
arr_new = arr1-arr2
print(arr_new)

####乘法----对应元素相乘,与矩阵相乘不同
arr_new = arr1*arr2
print(arr_new)

####除法-----对应元素相除,分母不能为0

arr_new = arr1/arr2
print(arr_new)


####比较运算-------返回bool值
print(arr1>arr2)
print(arr1>=arr2)
print(arr1<arr2)
print(arr1==arr2)


#####逻辑运算
## any   all

print(np.any(arr1==arr2))  ###只要一个满足条件,则True
print(np.all(arr1==arr2))  ###全部满足条件,才True


输出结果:

arr1: [[0 1]
 [2 3]]

arr2: [[1 2]
 [1 2]]

[[1 3]
 [3 5]]

[[-1 -1]
 [ 1  1]]

[[0 2]
 [2 6]]

[[0.  0.5]
 [2.  1.5]]

[[False False]
 [ True  True]]

[[False False]
 [ True  True]]

[[ True  True]
 [False False]]

[[False False]
 [False False]]
False
False

5.ufunc函数的广播机制广播(broadcasting)是指不同形状的数组之间执行算术运算的方式。需要遵循 4 个原
则。

1. 让所有输入数组都向其中 shape 最长的数组看齐,shape 中不足的部分都通过在前面加
1 补齐。
2. 输出数组的 shape 是输入数组 shape 的各个轴上的最大值。
3. 如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为 1 时,这个数组能
够用来计算,否则出错。
4. 当输入数组的某个轴的长度为 1 时,沿着此轴运算时都用此轴上的第一组值

import numpy as np

arr1 = np.array([[0,0,0,0],[1,1,1,1],[2,2,2,2],[3,3,3,3]])
print(arr1)

print('arr1的shape:',arr1.shape)

arr2 = np.array([1,2,3,4])
print(arr2)
print('arr2的shape',arr2.shape)

##相加
arr_new = arr1+arr2
print('arr_new:',arr_new)


输出结果:

[[0 0 0 0]
 [1 1 1 1]
 [2 2 2 2]
 [3 3 3 3]]

arr1的shape: (4, 4)
[1 2 3 4]
arr2的shape (4,)
arr_new: [[1 2 3 4]
 [2 3 4 5]
 [3 4 5 6]
 [4 5 6 7]]

猜你喜欢

转载自blog.csdn.net/weixin_43567965/article/details/92002553