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