概述
- Numpy本质上是一个多维数组库
- 创建多维数组很方便,可以替代多维列表
- 速度比多维列表块
- 支持向量和矩阵的各种数学运算
- 所有元素类型必须相同
创建数组的函数
函数 | 功能 |
---|---|
array(x) | 根据列表或元组x创建数组(即参数是列表或元组) |
arange(x,y,i) | 创建一维数组,元素等价于range(x,y,i)——[x,y)步长为i |
linespace(x,y,n) | 创建一个由区间[x,y]的n-1等分点构成的一维数组,包含x和y |
random.randint() | 创建一个元素为随机整数的数组=》python随机数是伪随机 |
zeros(n) | 创建一个元素全为0.0的 长度为n的数组 |
ones(n) | 创建一个元素全为1.0的 长度为n的数组 |
import numpy as np #以后numpy简写为np
print(np.array([1,2,3]))
#>>[1 2 3]
print(np.array((1,2,3)))
#>>[1 2 3]
print(np.arange(1,9,2)) #=>[1,9) 步长为2
#>>[1 3 5 7]
print(np.linspace(1,10,4))
#=> [1,10] 出一个元素n个的等差数列
#>>[ 1. 4. 7. 10.] x,y,n #==n-1等分点分出n个数
print(np.random.randint(10,20,[2,3]))
#>>[10,20) 范围里随机找数,生成两行三列的二维数组
#>>[[12 19 12]
#>> [19 13 10]]
print(np.random.randint(10,20,5))
#>>[16 10 13 18 17]
a = np.zeros(3)
print(a)
#>>[ 0. 0. 0.]
print(list(a)) #>>转化数据类型变回列表
#>>[0.0, 0.0, 0.0]
a = np.zeros((2,3),dtype=int) #创建一个2行3列的元素都是整数0的数组
print(a) #>>写了dtype=int使得里面的数字都是整数
#>>[[0 0 0]
#>> [0 0 0]]
Numpy数组常用属性和函数
属性或函数 | 含义或功能 |
---|---|
dtype | 数组元素的类型 |
ndim | 数组是几维的 |
shape | 数组每一维的长度 |
size | 数组元素个数 |
argwhere(…) | 查找元素 |
tolist() | 转换为list |
min() | 求最小元素 |
max() | 求最大元素 |
reshape(…) | 改变数组的形状 |
flatten() | 转换成一维数组 |
import numpy as np
b = np.array([i for i in range(12)]) #列表生成式生成列表做完参数转换为数组
#b是[ 0 1 2 3 4 5 6 7 8 9 10 11]
a = b.reshape((3,4)) #转换成3行4列的数组,b保持不变
print(a)
#>> [[ 0 1 2 3]
#>> [ 4 5 6 7]
#>> [ 8 9 10 11]]
print(len(a)) #>> 3 a有3行
print(a.size) #>> 12 a有12个元素
print(a.ndim) #>>2 a是二维的数组
print(a.shape) #>>(3,4) a是3行4列的数组
print(a.dtype) #>>int32 a的元素类型是31位的整数
L = a.tolist() #>> 转换为列表,赋值给L,a不变
print(L)#L是个二维列表
#>>[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
b = a.flatten()#转换成一维数组
print(b)
#>>[ 0 1 2 3 4 5 6 7 8 9 10 11]
Numpy数组元素增删
numpy数组一旦生成,元素就不能增删
函数增删的本质都是返回一个新数组
函数 | 功能 |
---|---|
append(x,y) | 若y是数组、列表或元组,就将y的元素添加金数组x得到新数组;否则将y本身添加进数组x得到新数组(x不变) |
concatenate(…) | 拼接多个数组或列表 |
delete(…) | 删除数组元素得到新数组 |
import numpy as np
a = np.array((1,2,3)) #a是[1 2 3]
b = np.append(a,10) #a不会发生变化
print(b)
#>>[ 1 2 3 10]
print(np.append(a,[10,20]))
#>>[ 1 2 3 10 20]
c = np.zeros((2,3),dtype=int)
#c是2行3列的全0数组
print(np.append(a,c)) #>>将c拧成一维,再append
#>>[1 2 3 0 0 0 0 0 0]
print(np.concatenate((a,[10,20],a)))
#>>[ 1 2 3 10 20 1 2 3]
#!!!注意多维数组的拼接
#c是两行三列的二维数组
print(np.concatenate((c,np.array([[10,20,30]]))))
#c拼接一行[10,20,30]得新数组
print(np.concatenate((c,np.array([[1,2],[10,20]])),axis=1))
#axis的参数表明拼接的发生在行拼接还是列拼接
#c的第0行拼接了1,2两个元素、第1行拼接了10,20两个新元素后得到新数组
#print(np.concatenate((c,np.array([[1],[2]]))))
#会报错!!!
import numpy as np
a = np.array((1,2,3,4))
b = np.delete(a,1) #删除a中下标为1的元素,a不会改变
print(b)
#>>[1 3 4]
print(a)
#>>[1 2 3 4] !!!是复制过去的新数组,不会改变a本身
b = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print(np.delete(b,1,axis=0))#删除b的第1行得新数组
#>>[[ 1 2 3 4]
#>> [ 9 10 11 12]]
print(np.delete(b,1,axis=1)) #删除b的第1列得新数组
#>>[[ 1 3 4]
#>> [ 5 7 8]
#>> [ 9 11 12]]
print(np.delete(b,[1,2],axis=0)) #删除b的第1行和第2行得新数组
#>>[[1 2 3 4]]
print(np.delete(b,[1,3],axis=1)) #删除b的第1列和第3列得新数组
#>>[[ 1 3]
#>> [ 5 7]
#>> [ 9 11]]
#!!!np的增删不会影响到操作的原数组
Numpy 查找
import numpy as np
a = np.array((1,2,3,5,3,4))
pos = np.argwhere(a==3)
print(pos)
#pos是[[2] [4]] #二维数组存储每一个符合条件的元素
a = np.array([[1,2,3],[4,5,2]])
print(2 in a)
#>>True
pos = np.argwhere(a==2)
print(pos)
#>>[[0 1] 第0行第1列
#>> [1 2]] 返回值是numpy的数组
b = a[a>2] #!!!达到条件筛查的结果
print(b)
#>>[3 4 5]
a[a > 2] = -1 #!!!直接进行了修改
print(a)
#>>[[ 1 2 -1]
#>> [-1 -1 2]]
Numpy数学运算
主要方便在能快速作用在整个数组
import numpy as np
a = np.array((1,2,3,4))
b = a + 1
print(b)
#>>[2 3 4 5]
print(a*b) #>>[2 6 12 20] a,b对应元素相乘
print(a+b) #>>[3 5 7 9] a,b对应元素相加
#相应元素,因此两个运算数组必须是同型的
c = np.sqrt(a*10) #a*10是[10 20 30 40]
print(c) #>>[ 3.16227766 4.47213595 5.47722558 6.32455532]
Numpy数组切片
numpy数组的切片是“视图”, 是原数组的一部分,而非一部分的拷贝
import numpy as np
a = np.arange(8) #a是[0 1 2 3 4 5 6 7]
b = a[3:6] #注意,b是a的一部分
print(b)
#>>[3 4 5]
c = np.copy(a[3:6]) #c是a的一部分的拷贝
b[0] = 100 #会修改a
print(a)
#>>[ 0 1 2 100 4 5 6 7]
print(c)
#>>[3 4 5] c不受b影响
#c是拷贝过来的
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
b = a[1:3,1:4]#二维切片,切除矩形
#行取值[1,3)
#列取值[1,4)
#b是>>[[ 6 7 8] [10 11 12]]