python/numpy学习笔记2

import numpy as np

#矩阵的乘法

a=np.array([[1,1],

            [0,1]])

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

print(a)

print(b)

print(a*b)               #这里是逐个相乘

print(np.dot(a,b))            #这里是真正的矩阵运算乘法

###这里   np.dot(a,b)=a.dot(b)

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

#生成随机矩阵
a0=np.random.random((2,4))
print(a0)       #这里是随机生成  0~1的随机数

[[8.36024711e-01 7.32069838e-04 7.62046606e-01 2.65831515e-02]
[8.36904991e-01 5.49310795e-01 5.23210806e-01 1.04377426e-01]]

#其他方法

print(np.sum(a0))          #给矩阵所有元素求和

print(np.min(a0))           #求矩阵中的最小值

print(np.max(a0))               #求矩阵的最大值

3.639190556154472
0.0007320698378613377
0.8369049906003381

a1=np.arange(12).reshape((3,4))

print(a1)

#设置运算范围参数

print(np.sum(a1))       #所有求和为一个数据

print(np.sum(a1,axis=0))        #列求和

print(np.sum(a1,axis=1))           #行求和

print(np.max(a1,axis=0))       #求列最大值

print(np.max(a1,axis=1))       #求行最大值

[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
66
[12 15 18 21]
[ 6 22 38]
[ 8 9 10 11]
[ 3 7 11]

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

print(A)

print(np.argmin(A))         #求最小值的索引

print(np.argmax(A))         #求最大值的索引

print(A.mean())   #求矩阵的平均值

print(np.average(A))         #这个也是求平均值,但是是老版本的,不能写成A.average()

print(np.median(A))           #求中位数

print(np.cumsum(A))      #这个是求累加的值 如1 1+2 1+2+3 ---------

print(np.diff(A))       #求每两个数之间的差值(3,4)-》(3,3)

print(np.nonzero(A))     #输出非0数的位置,前一个矩阵代表行数,后一个矩阵代表列数

[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
0
11
7.5
7.5
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))

#矩阵排序

B=np.array([[2,1,3],[5,2,1]])
print(B)
print(np.sort(B))      #这里是逐行排序

[[2 1 3]
[5 2 1]]
[[1 2 3]
[1 2 5]]

C=np.arange(14,2,-2).reshape((2,3)) #最后一个参数是步长
print(C)
print(C.T)         #这是矩阵的转置
print(np.transpose(C))      #一样的
print(C.tolist())        #矩阵转列表

[[14 12 10]
[ 8 6 4]]
[[14 8]
[12 6]
[10 4]]
[[14 8]
[12 6]
[10 4]]
[[14, 12, 10], [8, 6, 4]]

#矩阵的运算

D=np.arange(14,2,-1).reshape((3,4))
print((D.T).dot(D))      #这里是矩阵和他的转置相乘

[[332 302 272 242]
[302 275 248 221]
[272 248 224 200]
[242 221 200 179]]

#矩阵的截取
print(D)
print(np.clip(D,5,9))          #矩阵中保留5和9之间的数,所有小于5的数变成5,所有大于9的数变成9
print(np.mean(D,axis=0))      #求列的平均值

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

#矩阵的索引同C语言中二维数组的索引,但是可以有不同的写法,如   A[1,1] = A[1][1],
E=np.arange(1,13).reshape(3,4)
print(E)
print(E[1,1])
print(E[1][1]) 
print(E[2,:])                 #     如   A[2,:]代表第三行的所有数,像列表一样
print(E[:,1])               #代表第二列的所有数
print(E[1,1:3])         #第二行的第 1~3个数

[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
6
6
[ 9 10 11 12]
[ 2 6 10]
[6 7]

#使用循环遍历矩阵
print(E)
#默认的是行
for row in E:
    print(row)
for lie in E.T:        #通过转置,是得迭代他的列
    print(lie)

[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[1 2 3 4]
[5 6 7 8]
[ 9 10 11 12]
[1 5 9]
[ 2 6 10]
[ 3 7 11]
[ 4 8 12]

print(E.flatten())      #转为一维的可以进行全部迭代
for item in E.flatten():
    print(item)
print(E.flat)
for item in E.flat:       #相当于生成迭代器
    print(item)

[ 1 2 3 4 5 6 7 8 9 10 11 12]
1
2
3
4
5
6
7
8
9
10
11
12
<numpy.flatiter object at 0x000001E8EAF083C0>
1
2
3
4
5
6
7
8
9
10
11
12

#矩阵的合并
F=np.array([1,1,1])     #一维的默认是序列,不是矩阵,shape = 3,
G=np.array([2,2,2])
#这是上下合并
print(np.vstack((F,G)))         #注意合并的矩阵要作为一个参数穿进去,就是说要有一个括号括起来
#这是左右合并
print(np.hstack((F,G)))       #就是说左右连接在一起,合并两个序列  shape = 6,

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

#把序列变成竖着的矩阵
print(F)
print(F.T)       #显然这样是不行的
print(F[np.newaxis,:])       #这样是行上面加一个维度
print(F[np.newaxis,:].shape)
print(F[:,np.newaxis])       #这样是列上面加一个维度
print(F[:,np.newaxis].shape)
#使用这种方法测试左右合并
print(np.hstack((F[:,np.newaxis],G[:,np.newaxis])))

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

#不过相比vstack和hstack,这里有更好的合并方法
H=np.array([1,1,1])[:,np.newaxis]
I=np.array([2,2,2])[:,np.newaxis]
print(H)
print(I)
print(np.concatenate((H,H,I)))      #默认是上下合并
print(np.concatenate((H,H,I),axis=1))      #可以进行参数修改

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

#矩阵分割
J=np.arange(12).reshape(3,4)
print(J)
print(np.split(J,2,axis=1))  #第二个参数是分割成几部分,这里是实现相等分割
#实现不等分割
print(np.array_split(J,3,axis=1))
#下面有一个简化版的函数
print(np.vsplit(J,3))          #行分割
print(np.hsplit(J,2))           #列分割

[[ 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, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]

#注意numpy中的python中的矩阵赋值,不是创建新的地址,而是相当于指针直接指向同一个矩阵,
A1=np.array([0,1,2,3])
B1=A1
A1[0]=11
#        A的改变也会导致B的改变

print(B1,A1)

print(B1 is A1)

#所以如果要使用A的值而又不改变,关联A,要使用copy方法

C1=A1.copy()               #这里是深度copy

print(C1)

print(C1 is A1)

[11 1 2 3] [11 1 2 3]
True
[11 1 2 3]
False

#运算
arr=np.arange(12).reshape((3,4))
print(arr)
print(arr*10)
print(arr/2)

[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 10 20 30]
[ 40 50 60 70]
[ 80 90 100 110]]
[[0. 0.5 1. 1.5]
[2. 2.5 3. 3.5]
[4. 4.5 5. 5.5]]