numpy模块

numpy模块

numpy是Python的一种开源的数据计算扩展库,用来存储和处理大型矩阵

  1. 区别于list列表,提供数组操作,数组运算,以及统计分布和简单的数学模型

  2. 计算速度快

矩阵即numpy的ndarray对象,创建矩阵就是把一个列表传入np.array()方法

import numpy as np #约定俗成 np代表numpy

#一维
arr = np.array([1,2,3,4])
print(arr)
[1,2,3,4]

#二维
arr = np.array([[1,2,3,4],[5,6,7,8]])
[[1,2,3,4]
[5,6,7,8]]

#三维
[[[1,2,3,4],
[1,2,3,4],
[1,2,3,4]],

[[2,3,4,5],
[3,4,5,6],
[3,4,5,6]],

[[5,6,7,8],
[5,6,7,8],
[5,6,7,8]]]


arr = [[1,2,3]
      [4,5,6]]
#获取矩阵的行和列
print(arr.shape)
(2,3)

#获取矩阵的行

print(arr.shape[0])
2


# 获取矩阵的列
print(arr.shape[1])
3

切割矩阵

# 取所有元素
print(arr[:,:])


# 取第一行所有元素
print(arr[:1,:])

print(arr[0,[0,1,2,3,....(n个数则n-1)]])

# 取第一列所有元素

print(arr[:,:1])

print(arr[[0,1,2,3,..],0])

# 取第一行第一列的元素
print(arr[0,0])

#取大于5的元素,返回一个数组
print(arr[arr > 5])

#生成布尔矩阵
print(arr > 5)
[[False False False]
[True  False True ]]

矩阵元素替换

类似于列表的替换


# 取第一行所有元素变为0
arr1 = arr.copy()
arr1[:1,:] = 0
print(arr1)

# 去所有大于5的元素变为0
arr2 = arr.copy()
arr2[arr >5] = 0
print(arr2)


#对矩阵清零
arr3 = arr.copy()
arr3[:,:] = 0
print(arr3)

矩阵的合并

arr1 = [[1,2]
      [3,4]]

arr2 = [[5,6]
      [7,8]]

# 合并矩阵的行,用hstack的合并的话 会具有相同的行
#方法1
np.hstack((arr1,arr2))
[[1,2,5,6]
[3,4,7,8]]

#方法2
print(np.concatenate((arr1,arr2),axis=1))
[[1,2,5,6]
[3,4,7,8]]

# 合并矩阵的列,用vstack
#方法1
np.vstack((arr1,arr2))
[[1,2]
[3,4]
[5,6]
[7,8]]

# 方法2
print(np.contatenate((arr1,arr2),axis=0))



通过函数创建矩阵

arange

print(np.arange(10))#0-9数组
[0 1 2 3 4 5 6 7 8 9]

print(np.arange(1,5))#1-4数组
[1 2 3 4]

print(np.arange(1,20,2))#1-19,步长为2的数组
[1 3 5 7 9 11 13 15 17 19]

linspace/logspace
#构造一个等差数列,取头也取尾
np.linspace(0,20,5)
[0.5.10.15.20]

#构造一个等比数列,从10**0取到10**20,取5个数
np.logspace(0,20,5)
[ 1.00000e+00   1.00000e+05  1.00000e+10  1.00000e+15  1.00000e+20]

zero/ones/eye/empty

#构造全0矩阵
np.zeros((3,4))
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]

#构造全1矩阵
np.ones((X,Y))

#构造N个主元的单位矩阵
np.eye(n)
#例
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]

#构造一个随机矩阵,里面元素为随机生成
np.empty((x,y))

# fromstring通过对字符串的字符编码所对应ASCII编码的位置,生成一个ndarray对象
s = 'abcdef'
# np.int8表示一个字符的字节数为8
print(np.fromstring(s, dtype=np.int8))
[ 97  98  99 100 101 102]



def func(i, j):
   """其中i为矩阵的行,j为矩阵的列"""
   return i*j


# 使用函数对矩阵元素的行和列的索引做处理,得到当前元素的值,索引从0开始,并构造一个3*4的矩阵
print(np.fromfunction(func, (3, 4)))

[[ 0.  0.  0.  0.]
[ 0.  1.  2.  3.]
[ 0.  2.  4.  6.]]


 

矩阵的运算

+ - * / % **n

矩阵的点乘

必须满足第一个矩阵的列 = 第二个矩阵的行

 

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

arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(arr2.shape)
(3, 2)

assert arr1.shape[0] == arr2.shape[1]
# 2*3·3*2 = 2*2

print(arr1.dot(arr2))
[[ 58  64]
[139 154]]

 

矩阵的转置

相当于矩阵的行和列呼唤



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


print(arr.transpose())
[[1 4]
[2 5]
[3 6]]


print(arr.T)
[[1 4]
[2 5]
[3 6]]

矩阵的逆

矩阵行和列相同时候才可逆

arr = np.array([[1, 2, 3],  [4, 5, 6], [7, 8, 9]])
print(arr)
[[1 2 3]
[4 5 6]
[7 8 9]]

print(np.linalg.inv(arr))
[[ 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]]



# 单位矩阵的逆是单位矩阵本身
arr = np.eye(3)
print(arr)
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]

print(np.linalg.inv(arr))
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]

 

原文地址:https://www.cnblogs.com/zrx19960128/p/11052279.html