本教程是numpy快速入门教程的最后一篇,在这篇文章中,我将会介绍到一些关于numpy的快捷操作以及numpy的广播。
一、获取和修改数组的值
1、根据下标获取和修改数组的值
import numpy as np
#numpy修改数组值得快捷操作
if __name__ == "__main__":
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
#创建获取数组的指定列的下标
col_index = np.array([1,2,0])
#根据所选的列下标数组获取数组中的元素,np.arrage(3),会产生一个[0,1,2]的数组
result1 = a[np.arange(3),col_index]
print(result1) #[2 6 7]
#修改指定下标位置的元素值
a[np.arange(3), col_index] += 6
print(a)
'''
[[ 1 8 3]
[ 4 5 12]
[13 8 9]]
'''
2、根据一个bool类型的数组来获取数组的值
'''
通过一个boolean类型的数组来选择数组中的元素
'''
d = np.array([[5,1,3,4],[6,8,9,1],[10,4,2,1]])
#选出数组中大于3的元素
bool_con = d > 3
#获取满足条件的元素
d_con = d[bool_con]
print(d_con) #[ 5 4 6 8 9 10 4]
print(d[d > 3]) #[ 5 4 6 8 9 10 4]
二、numpy的数据类型
import numpy as np
if __name__ == "__main__":
'''
numpy提供了许多的数据类型,在创建数组没有指定数据类型,numpy会提供了一个默认的数据类型
'''
a = np.array([1,2,3])
print(a.dtype) #int32
b = np.array([1.1,2.0,3.0])
print(a.dtype) #int32
c = np.array([1,2,3],dtype=np.int64)
print(c.dtype) #int64
三、numpy数组的基本操作
1、数组之间的加、减、乘、除
import numpy as np
if __name__ == "__main__":
#创建两个数组,指定数组的数据类型为float32
x = np.array([[1,2],[3,4]],dtype=np.float32)
y = np.array([[5,6],[7,8]],dtype=np.float32)
#数组之间的加法
add1 = x + y
add2 = np.add(x,y)
print(add1)
'''
[[ 6. 8.]
[ 10. 12.]]
'''
print(add2)
'''
[[ 6. 8.]
[ 10. 12.]]
'''
#数组之间的减法
subxy1 = x - y
subxy2 = np.subtract(x,y)
print(subxy1)
'''
[[-4. -4.]
[-4. -4.]]
'''
print(subxy2)
'''
[[-4. -4.]
[-4. -4.]]
'''
#数组之间的乘法
mulxy1 = x * y
mulxy2 = np.multiply(x,y)
print(mulxy1)
'''
[[ 5. 12.]
[ 21. 32.]]
'''
print(mulxy2)
'''
[[ 5. 12.]
[ 21. 32.]]
'''
#数组之间的除法
divxy1 = x/y
divxy2 = np.divide(x,y)
print(divxy1)
'''
[[ 0.2 0.33333334]
[ 0.42857143 0.5 ]]
'''
print(divxy2)
'''
[[ 0.2 0.33333334]
[ 0.42857143 0.5 ]]
'''
#求数组的平方根
sqrtx = np.sqrt(x)
print(sqrtx)
'''
[[ 1. 1.41421354]
[ 1.73205078 2. ]]
'''
2、数组之间的点乘
#数组之间的点乘,注意左乘和右乘的区别,注意两个数组点乘的条件是前一个矩阵的列等于后一个矩阵的行
# 创建两个数组,指定数组的数据类型为float32
x = np.array([[1, 2], [3, 4]], dtype=np.float32)
y = np.array([[5, 6], [7, 8]], dtype=np.float32)
dotxy1 = np.dot(x,y) #等价于x.dot(y)
print(dotxy1)
'''
[[ 19. 22.]
[ 43. 50.]]
计算过程
19 = 1*5 + 2*7
22 = 1*6 + 2*8
43 = 3*5 + 4*7
50 = 3*6 + 4*8
'''
dotxy2 = np.dot(y,x) #等价于y.dot(x)
print(dotxy2)
'''
[[ 23. 34.]
[ 31. 46.]]
计算过程
23 = 5*1 + 6*3
34 = 5*2 + 6*4
31 = 7*1 + 8*3
46 = 7*2 + 8*4
'''
3、数组求和
#数组求和函数
x = np.array([[1, 2], [3, 4]], dtype=np.float32)
#求所有数组元素的和
sum1 = np.sum(x)
print(sum1) #10.0
#求数组相同列之间元素的和
sum2 = np.sum(x,axis=0)
print(sum2) #[ 4. 6.]
#求数组相同行之间元素的和
sum3 = np.sum(x,axis=1)
print(sum3) #[ 3. 7.]
4、矩阵的转置
#求矩阵的转置,将矩阵的行变成列,列变成行
x = np.array([[1, 2], [3, 4]], dtype=np.float32)
print(x)
'''
[[ 1. 2.]
[ 3. 4.]]
'''
transposition_x = x.T
'''
[[ 1. 3.]
[ 2. 4.]]
'''
print(transposition_x)
四、数组的广播
import numpy as np
#广播
'''
广播是numpy提供的一个非常重要的技巧对于操作不同大小的矩阵
1、如果两个数组的阶不相同,将低阶的数组大小转换成与高阶的大小相同
2、如果两个数组的维度相同或者其中一个数组的维度为1
3、数组在所有的维度上都可以进行广播
4、经过广播之后的两个数组,数组的大小等于维度最大的那个
5、如果一个数组的维度为1,而另一个数组的维度是任意的,那么这个维度为1的数组,会复制自己的元素达到与另一个数组拥有相同的维度
'''
if __name__ == "__main__":
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
v = np.array([1,0,1])
#给矩阵a的每一行都加上v,在执行下面代码的时候,numpy会自动调用广播
#将矩阵v先扩展成为[[1,0,1],[1,0,1],[1,0,1]]然后再与矩阵a做加法
b = a +v
print(b)
'''
[[ 2 2 4]
[ 5 5 7]
[ 8 8 10]]
'''
v1 = np.array([2])
b1 = a + v1
print(b1)
'''
[[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
'''
#并不是所有的不同维度数组之间的操作都可以使用广播
v2 = np.array([1,2])
b2 = a + v2
#ValueError: operands could not be broadcast together with shapes (3,3) (2,)
print(b2)