一、Numpy属性
array = np.array([[1,2,3],[4,5,6]],dtype=float) #讲列表转换为矩阵
print("array是几维数组:",array.ndim) W
print("array的形状:",array.shape)
print("array的元素个数:",array.size)
print("array的元素属性:",array.dtype)
Result:
array是几维数组: 2
array的形状: (2, 3)
array的元素个数: 6
array的元素属性: float64
二、Numpy创建数组array
#array的形式
a = np.array([2,4,5],dtype=np.float64)
print("array的数据类型:",a.dtype)
Result:
array的数据类型: float64
#定义值为0的矩阵
b = np.zeros((3,4)) #注意这里声明3行4列要有一个括号
print(b)
Result:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
#定义值为1的矩阵
c = np.ones((3,4))
print(c)
Result:
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
#定义一个什么都没有的矩阵
d = np.empty((3,4))
print(d)
Result:
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
#生成一个有序的序列
e = np.arange(10,20,2) #第一个参数是初始值,第二个参数是终点值,第三个参数是步长
e1 = np.arange(20,10,-1) # -1 表示反向生成
print("正向生成:",e)
print("反向生成",e1)
Result:
正向生成: [10 12 14 16 18]
反向生成 [20 19 18 17 16 15 14 13 12 11]
#根据已经有的序列定义一个矩阵
f = np.arange(12).reshape((3,4))
print(f)
Result:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
#根据给出的数据生成一个线段
g = np.linspace(1,10,5) #第一个参数是初始值,第二个参数是终点值,第三个参数是段数
print(g)
Result:
[ 1. 3.25 5.5 7.75 10. ]
三、Numpy的基础运算
a = np.array([1,2,3,4])
b = np.arange(4)
c = a - b
print("a的值:",a,"b的值:",b)
print("c的值:",c)
print("b的平方",b**2,"b的四次方",b**4)
Result:
a的值: [1 2 3 4] b的值: [0 1 2 3]
c的值: [1 1 1 1]
b的平方 [0 1 4 9] b的四次方 [ 0 1 16 81]
# 对于数字的sin三角运算
e =np.sin(a)
print("a的sin值为",e)
Result:
a的sin值为 [ 0.84147098 0.90929743 0.14112001 -0.7568025 ]
# numpy有两种矩阵乘法,一种是逐个相乘,一种是矩阵相乘
a = np.array([[1,1],[1,2]])
b = np.arange(4).reshape((2,2))
c = a * b
print("a矩阵:",a,"b矩阵",b)
print("a * b",c)
c = np.dot(a,b) #a.dot(b) 也可以
print("矩阵相乘",c)
Result:
a矩阵:
[[1 1]
[1 2]]
b矩阵
[[0 1]
[2 3]]
a * b
[[0 1]
[2 6]]
矩阵相乘
[[2 4]
[4 7]]
#求矩阵和、最小值、最大值
a = np.random.random((2,4)) # 第一个random是模块,第二个random是函数
print("随机生成的a:",a)
print(np.sum(a))
print(np.min(a,axis=0)) # axis = 0 是在lie数中求和,axis = 1是在行数中求和
print(np.max(a))
Result:
随机生成的a: [[0.73575864 0.18256228 0.36581254 0.81135318] [0.12868261 0.20950966 0.32211043 0.02975593]]
2.785545270769166
[0.12868261 0.18256228 0.32211043 0.02975593]
0.811353176231199
A = np.arange(12).reshape((3,4))
print(A)
#索引最小,最大
print("最小最大索引分别为:",np.argmin(A),np.argmax(A))
Result:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
最小最大索引分别为: 0 11
#计算整个矩阵的平均值
print(np.mean(A)) #用A.mean()也是可以的
#计算加权平均数
print(np.average(A))
#计算中位数
print(np.median(A))
Result:
5.5
5.5
5.5
#逐步想加,斐波那契数列
print(np.cumsum(A))
Result:
[ 0 1 3 6 10 15 21 28 36 45 55 66]
#每两个数之间的差
print(np.diff(A))
Result:
[[1 1 1]
[1 1 1]
[1 1 1]]
#输出矩阵中的非0数位置
print(np.nonzero(A))
Result:
(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
#对矩阵的元素进行排序
print(np.sort(A))
Result:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
#A的转置矩阵
print(A.T)
Result:
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
# 控制范围函数
print(np.clip(A,5,9)) #第一个参数是矩阵,第二个参数是最小数,第三个参数是最大数。 意思是,如果有小于5的数,全部设为5,如果有大于9的数,全部设为9
Result:
[[5 5 5 5]
[5 5 6 7]
[8 9 9 9]]
四、Numpy的索引
A = np.arange(3,15).reshape((3,4))
print(A)
print(A[1][1]) # 也可以写成A[1,1]
print(A[1,1:2])
Result:
[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
8
[8]
#A的逐项迭代
for item in A.flat:
print(item)
Result:
3
4
5
6
7
8
9
10
11
12
13
14
#A的行迭代
for row in A:
print(row)
Result:
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
#A的列迭代
for colum in A.T:
print(colum)
Result:
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
五、Numpy的合并
A = np.array([1,1,1])[:,np.newaxis] #np.newaxis 就是插入新维度的意思,比如将一维数组变成二维数组,二维变成三维等
B = np.array([2,2,2])[:,np.newaxis]
#上下合并
print(np.vstack((A,B)))
Result:
[[1]
[1]
[1]
[2]
[2]
[2]]
#左右合并
print(np.hstack((A,B)))
Result:
[[1 2]
[1 2]
[1 2]]
#合并
C = np.concatenate((A,B,B,A),axis=1)
print(C)
Result:
[[1 2 2 1]
[1 2 2 1]
[1 2 2 1]]
六、Numpy的分割
A = np.arange(12).reshape((3,4))
print(A)
print(np.split(A,3,axis=0))
# print(np.split(A,3,axis=1)) #会报错,因为有四列,所以没法均分为3列
Result:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
#特殊割
print(np.array_split(A,3,axis=1))
Result:
[array([[0, 1],
[4, 5],
[8, 9]]),
array([[ 2],
[ 6],
[10]]),
array([[ 3],
[ 7],
[11]])]
#快捷方式切
print(np.vsplit(A,3)) #纵向分成三块的分割
print(np.hsplit(A,4)) #横向分为4快的分割
Result:
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0],
[4],
[8]]),
array([[1],
[5],
[9]]),
array([[ 2],
[ 6],
[10]]),
array([[ 3],
[ 7],
[11]])]
七、Numpy的copy和deep copy
a = np.arange(4)
b = a
print(b is a)
b[0]=2
print(b is a) # why ? 修改B,A也跟着变了,说明指针指向了同一个地址,那应该怎么杜绝这种现象?
# 深度copy
b = a.copy()
b[1] = 12
print(b is a) # Fasle ,这样改变B,A就不会变了
Result:
True
True
False
八、怎么将Numpy转换成Tensor,Tensor怎么转换Numpy?
Numpy----->Tensor:
方式一:
x = np.ones(5) # 声明一个Numpy数组 <class 'numpy.ndarray'>
x = torch.tensor(x) # 将x转换成Tensor <class 'torch.Tensor'>
方式二:
x = torch.from_numpy(x)
Tensor------->Numpy
方式一:
x = torch.ones(5) # 创建张量x # tensor([1., 1., 1., 1., 1.])
x_ = x.detach().numpy() # 转换 # array([1., 1., 1., 1., 1.], dtype=float32)
方式二:
x_= x.numpy()