numpy在矩阵中的简单应用

 不得不吐槽一下:老板约好的今天讨论论文,结果又被放鸽子,结果一看朋友圈,老板居然在绕校园跑步,真特么心累。。。。

 

1.简单的一维二维数组:

import numpy as np

"""一维numpy数组"""
a= np.array([1,2,3])#一维数组
print(a)
print(type(a))
print(a.shape)
print(a[0],a[1],a[2])
a[0]=5#重赋值
print(a)
"""二维numpy数组"""
print('_______________________________')
b = np.array([[1,2,3],[4,5,6]])
print(b)
print(b.shape)
print(b[0,0],b[0,1],b[1,0])


输出结果:
[1 2 3]
<class 'numpy.ndarray'>
(3,)
1 2 3
[5 2 3]
_______________________________
[[1 2 3]
 [4 5 6]]
(2, 3)
1 2 4

2.全0矩阵,全1矩阵,对角矩阵,固定矩阵,随机矩阵

import numpy as np

"""全0的2*2 Numpy数组"""
a = np.zeros((2,2))
print(a)
"""全0的2*2 Numpy数组"""
b = np.ones((2,2))
print(b)
"""2*2 对角Numpy数组"""
c = np.eye(2)
print(c)
"""固定值Numpy数组"""
d = np.full((2,2),7)
print(d)
"""2*2 随机Numpy数组"""
e = np.random.random((2,2))
print(e)

输出:
[[0. 0.]
 [0. 0.]]
[[1. 1.]
 [1. 1.]]
[[1. 0.]
 [0. 1.]]
[[7 7]
 [7 7]]
[[0.73193226 0.32700548]
 [0.56660598 0.88905633]]

3..创建自己的数组,切片取出特定行列数组,取出数据和原始数据属于tong同一份数据

import numpy as np
"""创建如下3x4的 numpy数组
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
 """
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print(a)

b = a[:2,1:3]#:2前两行,1:3前3列,从第1列开始  通过slicing(切片)取出前两行的2到3列
print(b)
"""取出的b中的数据实际上和a中的数据是同一份数据"""
print(a[0,1])
print(b[0,0])
b[0,0]=77
print(a[0,1])#b被修改,a也被修改


输出:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
[[2 3]
 [6 7]]
2
2
77

4.切片,行列的选取

import numpy as np

a= np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print(a)

"""行的选取,切片选行"""
row_r1 = a[1,:]#a的第二行
print(row_r1,row_r1.shape)
row_r2 = a[1:2,:]#a的第二行,输出格式略有不同
print(row_r2,row_r2.shape)

print("______________________________________")
"""列的选取,切片选列"""
col_r1 = a[:,1]#a的第二列
print(col_r1,col_r1.shape)
col_r2 = a[:,1:2]#a的第二列,输出格式略有不同
print(col_r2,col_r2.shape)


输出:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
[5 6 7 8] (4,)
[[5 6 7 8]] (1, 4)
______________________________________
[ 2  6 10] (3,)
[[ 2]
 [ 6]
 [10]] (3, 1)

5.两种方式取出特定位置的值

import numpy as np

a = np.array([[1,2],[3,4],[5,6]])
print(a)
"""第一种取值方式"""
print(a[[0,1,2],[0,1,0]])#取出(0,0),(1,1),(2,0,)三个位置的值
"""第二种取值方式"""
print(np.array([a[0,0],a[1,1],a[2,0]]))#取出(0,0),(1,1),(2,0,)三个位置的值

print(a[[0,0],[1,1]])#取出(0,1)(0,1)两个位置的值
print(np.array([a[0,1],a[0,1]]))#取出(0,1)(0,1)两个位置的值


输出:
[[1 2]
 [3 4]
 [5 6]]
[1 4 5]
[1 4 5]
[2 2]
[2 2]

6.两种取特定值写法,输出矩阵中大于某个值的值

import numpy as np

a = np.array([[1,2],[3,4],[5,6]])
print(a)
"""分开的写法"""
bool_idx = (a>2)#判定a>2的结果矩阵
print(bool_idx)
print(a[bool_idx])#通过bool_idx取出我们要的值
"""放在一起的写法"""
print(a[a>2])

输出:
[[1 2]
 [3 4]
 [5 6]]
[[False False]
 [ True  True]
 [ True  True]]
[3 4 5 6]
[3 4 5 6]

7.查看数据类型对象(dtype),对象的类型

import numpy as np

x = np.array([1,2])
print(x.dtype)
print(type(x))

x = np.array([1.0,2.0])
print(x.dtype)
print(type(x))

x = np.array([1,2],dtype=np.float32)#强制使用某个type
print(x.dtype)
print(type(x))

输出:
int32
<class 'numpy.ndarray'>
float64
<class 'numpy.ndarray'>
float32
<class 'numpy.ndarray'>

8.Nump简单运算:矩阵元素加减乘除开平方根

import numpy as np

x = np.array([[1,2],[3,4]],dtype=np.float32)
y = np.array([[5,6],[7,8]],dtype=np.float32)
print(x)
print(y)
"""矩阵中每个元素相加,两种方法"""
print(x+y)
print(np.add(x,y))
"""矩阵中每个元素相减,两种方法"""
print(x-y)
print(np.subtract(x,y))
"""元素对元素,点对点的乘积,两种方法"""
print(x*y)
print(np.multiply(x,y))
"""元素对元素,点对点的除法,两种方法"""
print(x/y)
print(np.divide(x,y))
"""开平方根"""
print(np.sqrt(x))

输出:
[[1. 2.]
 [3. 4.]]
[[5. 6.]
 [7. 8.]]
[[ 6.  8.]
 [10. 12.]]
[[ 6.  8.]
 [10. 12.]]
[[-4. -4.]
 [-4. -4.]]
[[-4. -4.]
 [-4. -4.]]
[[ 5. 12.]
 [21. 32.]]
[[ 5. 12.]
 [21. 32.]]
[[0.2        0.33333334]
 [0.42857143 0.5       ]]
[[0.2        0.33333334]
 [0.42857143 0.5       ]]
[[1.        1.4142135]
 [1.7320508 2.       ]]

9.矩阵的乘法,也就是所谓的矩阵的内积操作

参考链接:

矩阵外积与内积 - CareChere的博客 - CSDN博客  https://blog.csdn.net/carechere/article/details/78496752

import numpy as np

x = np.array([[1,2],[3,4]],dtype=np.float32)
y = np.array([[5,6],[7,8]],dtype=np.float32)

v = np.array([9,10])
w = np.array([11,12])

"""向量内积"""
print(v.dot(w))
print(np.dot(v,w))
print(np.dot(w,v))

"""矩阵乘法"""
print(x.dot(v))
print(np.dot(x,v))

print(x.dot(y))
print(np.dot(x,y))

输出:
219
219
219
[29. 67.]
[29. 67.]
[[19. 22.]
 [43. 50.]]
[[19. 22.]
 [43. 50.]]

10.常规操作求和:sum()

import numpy as np

x = np.array([[1,2],[3,4]],dtype=np.float32)
print(np.sum(x))#对整个矩阵求和
print(np.sum(x,axis=0))#对列求和
print(np.sum(x,axis=1))#对行求和


输出:
10.0
[4. 6.]
[3. 7.]

11.常规操作转置:.T

import numpy as np

x = np.array([[1,2],[3,4]],dtype=np.float32)
print(x)
print(x.T)#转置

"""1*n的Numpy数组,用.T之后其实什么也没做"""
v = np.array([1,2,3])
print(v)
print(v.T)

输出:
[[1. 2.]
 [3. 4.]]
[[1. 3.]
 [2. 4.]]
[1 2 3]
[1 2 3]

12.他娘的一个比较牛批的机制_broadcasting,如果有一大一小两个矩阵,用小矩阵在大矩阵上操作

用for循环实现简单的操作,并不改变原来的y:

import numpy as np

x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
v = np.array([1,0,1])
y = np.empty_like(x)#创建一个和x一样维度的Numpy数组y
print(x)
print(v)
print(y)

for i in range(4):
    y[i,:] = x[i,:] + v

print(y)

输出结果:
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
[1 0 1]
[[0 0 0]
 [0 0 0]
 [0 0 0]
 [0 0 0]]
0
1
2
3
[[ 2  2  4]
 [ 5  5  7]
 [ 8  8 10]
 [11 11 13]]

如果for的次数非常多,改进一下

import numpy as np

x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
v = np.array([1,0,1])
vv = np.tile(v,(4,1))#(4,1)代表在列上重复4次,在行上重复1次
print(vv)
print(x+vv)
print(np.add(x,vv))

输出:
[[1 0 1]
 [1 0 1]
 [1 0 1]
 [1 0 1]]
[[ 2  2  4]
 [ 5  5  7]
 [ 8  8 10]
 [11 11 13]]
[[ 2  2  4]
 [ 5  5  7]
 [ 8  8 10]
 [11 11 13]]

直接利用Numpy的broadcasting机制,这特么的贼溜:

import numpy as np

x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
v = np.array([1,0,1])
print(x+v)#直接加,你没看错

输出:
[[ 2  2  4]
 [ 5  5  7]
 [ 8  8 10]
 [11 11 13]]

其他几个broadcasting的例子:

import numpy as np

v = np.array([1,2,3])#v has shape (3,)
w = np.array([4,5])#w has shape (2,)

print(np.reshape(v,(3,1))*w)#v变成(3,1) 和 w 作用,得到(3,2)

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

print((x.T + w).T)
print(x+np.reshape(w,(2,1)))

输出:
[[ 4  5]
 [ 8 10]
 [12 15]]
[[2 4 6]
 [5 7 9]]
[[ 5  6  7]
 [ 9 10 11]]
[[ 5  6  7]
 [ 9 10 11]]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值