当前位置:   article > 正文

python之numpy库

numpy库

目录

numpy是什么?

ndarray对象

使用array创建数组

array参数

array与asarray的区别

ndarray数组的属性

ndarray.shape

ndarray.ndim

ndarray.size

ndarray.itemsize

ndarray.dtype

ndarray中使用便捷函数创建数组

使用arange创建等差数组(指定步长)

使用linspace创建等差数列(指定数量)

使用logspace创建等比数列

使用ones创建全是1的数组

使用ones_like创建形状相同的全是1的数组

使用zeros创建全是0的数组

使用zeros_like创建形状形同的全是0的数组

使用empty创建未初始化的数组

使用empty_like创建形状相同的未初始化的数组      

使用full创建指定值的数组

使用full_like创建形状相同的指定值的数组

ndarray数组本身支持的大量操作和函数

reshape()方法

resize()方法

ndarray.T

flatten()方法

ravel()方法

flatten()与ravel()的区别

astype()方法

tobytes() 或 tostring()

np.unique(ar,return_index=False,return_inverse=False,return_counts=False)

数组中元素间的算术运算

数组间的算术运算

对数组按索引查询

基础索引

神奇索引

布尔索引

条件的组合索引

常用的random随机函数

seed(seed=None)

rand(d0, d1, ..., dn)


numpy是什么?

--- 一个开源的python科学计算库。

--- 使用numpy可以方便的使用数组、矩阵进行计算。

--- 包含线性代数、傅里叶变换、随机数生成等大量函数。

ndarray对象

--- ndarray(全称The N-dimensional array)是存储着相同类型和大小的元素的一维数组或多维数组对象,是numpy的核心数据结构。

--- 与Python的List的区别是,它元素必须是同一种数据类型,这也是Numpy高性能的一个原因。

使用array创建数组

array参数

名称描述
object数组或嵌套的数列
dtype数组元素的数据类型,可选
copy对象是否需要复制,可选
order创建数组的样式,C为行方向,F为列方向,A为任意方向
subok默认返回一个与基类类型一致的数组
ndmin指定生成数组的最小维度

--- 创建一维数组:

  1. import numpy as np
  2. a = np.array([1,2,3,4,5,6,7,8])
  3. a #输出:arrry([1,2,3,4,5,6,7,8])
  4. print(a) #输出: [1,2,3,4,5,6,7,8]

--- 创建多维数组:

  1. import numpy as np
  2. A = np.array([
  3. [1,2,3,4]
  4. [5,6,7,8]
  5. ])
  6. A '''输出:array([
  7. [1,2,3,4]
  8. [5,6,7,8]
  9. ]'''
  10. print(A) #输出 [[1,2,3,4],[[5,6,7,8]]

array与asarray的区别

假设借用已有的数组生成另外的数组时,np.array是对已存在的数组进行深拷贝,而np.asarray则是对已存在的数组进行浅拷贝。

  1. import numpy as np
  2. a = np.array([1,2,3],[4,5,6])
  3. a1 = np.array(a) #对数组a进行深拷贝
  4. a2 = np.asarray(a) #对数组a进行浅拷贝
  5. a[0,0] = 100
  6. a #输出:array([100,2,3],[4,5,6])
  7. a1 #输出:array([1,2,3],[4,5,6])
  8. a2 #输出:array([100,2,3],[4,5,6])

ndarray数组的属性

ndarray.shape

  --- 指数组维度的元组

  1. print(a.shape) #输出: (8,)
  2. print(A.shape) #输出: (2,4)

ndarray.ndim

  --- 指数组维度

  1. print(a.ndim) #输出: 1
  2. print(A.adim) #输出: 2

ndarray.size

  --- 指数组中的元素数量

  1. print(a.size) #输出: 8
  2. print(A.size) #输出: 8

ndarray.itemsize

 --- 指一个数组元素的长度(在多维数组中指一行的长度)

  1. print(a.itemsize) #输出:8
  2. print(A.itemsize) #输出:4

ndarray.dtype

  --- 指数组元素的类型

  1. print(a.dtype) #输出:int32
  2. print(A.dtype) #输出:int32

ndarray中使用便捷函数创建数组

使用arange创建等差数组(指定步长)

 --- np.arange([start,]stop[,step,]dtype=None)

参数说明:

参数描述
start起始值,默认值0
stop终止值(不包含)

step

步长,默认为1
dtype返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型
  1. import numpy as np
  2. np.arange(10) #输出:array([0,1,2,3,4,5,6,7,8,9])
  3. print(np.arrange(10)) #输出:[0,1,2,3,4,5,6,7,8,9]
  4. np.arange(1,10,2) #输出:array([1,3,5,7,9])
  5. print(np.arange(1,10,2) #输出:[1,3,5,7,9]

使用linspace创建等差数列(指定数量)

 --- np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=float)

参数说明:

参数描述
start序列的起始值
stop序列的终止值
num要生成的元素的数量,默认为50
endpoint序列中是否包含stop的值,默认为True
retstep是否在生成的数组中显示间距(公差),默认为False
dtypendarray的数据类型,默认为float
  1. import numpy as np
  2. np.linspace(0,99,5) #输出: array([ 0. , 24.75, 49.5 , 74.25, 99. ])
  3. np.linspace(0,99,5,endpoint=False) #输出:array([ 0. , 19.8, 39.6, 59.4, 79.2])
  4. np.linspace(0,99,5,retstep=True) #输出:(array([ 0. , 24.75, 49.5 , 74.25, 99. ]), 24.75)

使用logspace创建等比数列

 --- np.logspace(start,stop,num=50,endpoint=True,base=10,dtype=None)

参数说明:

参数描述
start等比数列开始的幂次方
stop等比数列结束的幂次方
num要生成的元素的数量,默认为50
endpoint序列中是否包含stop的值,默认为True
base幂次方中的底数
dtypendarray的数据类型,默认为float
  1. import numpy as np
  2. np.logspace(0,3,4) #输出:array([ 1., 10., 100., 1000.])
  3. np.logspace(0,3,4,endpoint=False) #输出:array([ 1. , 5.62341325, 31.6227766 , 177.827941 ])
  4. np.logspace(0,3,4,base=5) #输出:array([ 1., 5., 25., 125.])

使用ones创建全是1的数组

 --- np.ones(shape,dtype=float,order='C')

参数说明:shape:int or tuple of its shape of the new array e.g.,(2,3) or 2.  (即数组维度的元组)

参数描述
shape数组维度的元组
dtype数据类型,可选,默认为float
order有'C'和'F'两个选项,分别代表行优先和列优先,在计算机内存中的存储元素的顺序,默认为'C'
  1. from numpy as np
  2. np.ones(10) #输出:array([1.,1.,1.,1.,1.,1.,1.,1.,1.,1.])
  3. np.ones((2,5)) '''输出: array([[1.,1.,1.,1.,1.],
  4. [1.,1.,1.,1.,1.]] '''

使用ones_like创建形状相同的全是1的数组

 --- np.ones_like(a,dtype=None,order='K')

参数说明:

参数描述
a为其他的np.array对象
dtype数据类型,默认为参数a中元素本身的类型
order重写结果的内存布局,默认为'K',表示尽可能比配参数a的布局

创建一个与参数a形状相同的全是1的数组

  1. import numpy as np
  2. a = np.array([1,2,3,4,5,6,7,8])
  3. A = np.array([[1,2,3,4],
  4. [5,6,7,8]])
  5. np.ones_like(a) #输出: array([1,1,1,1,1,1,1,1]
  6. np.ones_like(A) ''' 输出:array([[1,1,1,1],
  7. [1,1,1,1]]'''

使用zeros创建全是0的数组

 --- np.zeros(shape,dtype=float,order='C')

参数说明:与ones函数的参数一致。

  1. import numpy as np
  2. np.zeros(10) #输出:array([0.,0.,0.,0.,0.,0.,0.,0.,0.,0.])
  3. np.zeros((2,3) '''输出:array([[0.,0.,0.],
  4. [0.,0.,0.]]'''

使用zeros_like创建形状形同的全是0的数组

 --- np.zeros_like(a,dtype=None,order='K')

参数:K:表示尽可能匹配参数a的布局。

  1. import numpy as np
  2. a = np.array([1,2,3,4,5,6,7,8])
  3. A = np.array([[1,2,3,4],
  4. [5,6,7,8]])
  5. np.zeros_like(a) #输出: array([0,0,0,0,0,0,0,0]
  6. np.zeros_like(A) ''' 输出:array([[0,0,0,0],
  7. [0,0,0,0]]

使用empty创建未初始化的数组

 --- np.empty(shape,dtype=float,order='C')

注意:创建数组后,里面的值是未初始化的,可能是随机值,但是不要用!

  1. import numpy as np
  2. np.empty(10) '''输出:array([ 6.46048250e-313, 4.37300893e-308, 1.33360305e+241,
  3. 1.71881659e-312, 1.70359515e-269, 1.73315708e-
  4. 260,1.73156919e-260, -1.48480832e+188,
  5. 1.00000000e+000,3.01874110e-321]) '''
  6. np.empty((2,3)) '''输出:array([[6.95196574e-310, 6.95196574e-310, 0.00000000e+000],
  7. [0.00000000e+000, 6.95196573e-310, 1.36279859e-311]])

使用empty_like创建形状相同的未初始化的数组      

  --- np.empty_like(a,dtype=None,order='K')                                                         

  1. import numpy as np
  2. a = np.array([1,2,3,4,5,6,7,8])
  3. A = np.array([[1,2,3,4],
  4. [5,6,7,8]])
  5. np.empty_like(a) #输出:array([1, 1, 1, 1, 1, 1, 1, 1])
  6. np.empty_like(A) '''输出:array([[1, 1, 1, 1],
  7. [1, 1, 1, 1]])'''

使用full创建指定值的数组

 --- np.full(shape,full_vall,dtype=None)

参数说明:

参数描述
shape数组维度的元组
full_value数组中元素的值
  1. import numpy as np
  2. np.full(10,666) #输出:array([666, 666, 666, 666, 666, 666, 666, 666, 666, 666])
  3. np.full((2,5),555) #输出:array([[555, 555, 555, 555, 555],
  4. [555, 555, 555, 555, 555]])

使用full_like创建形状相同的指定值的数组

 --- np.full_like(a,full_value,dtype=None)

  1. import numpy as np
  2. a = np.array([1,2,3,4,5,6,7,8])
  3. A = np.array([[1,2,3,4],
  4. [5,6,7,8]])
  5. np.full_like(a,666) #输出:array([666,666,666,666,666,666,666,666])
  6. np.full_like(A,666) '''输出:array[[666,666,666,666]
  7. [666,666,666,666]])

ndarray数组本身支持的大量操作和函数

reshape()方法

 --- reshape(shape,order='C'),用来改变数组维度(有返回值)

  1. import numpy as np
  2. a = array([1,2,3,4])
  3. A = array([[1,2,3,4],[5,6,7,8]])
  4. a.reshape((2,2)) #输出:array([[1,2],[3,4]])
  5. A.reshape(8) #输出:array([1,2,3,4,5,6,7,8])

使用便捷函数创建的ndarray数组都可以使用此方法。

注意:在转换形状的时候一定要注意数组元素个数的匹配!

resize()方法

resize(new_shape),修改数组本身的形状(无返回值)

--- 若修改后的数组中的元素个数少于原先未修改数组中的元素个数,则自第一行开始,从左往右依次取数;

--- 若修改后的数组中的元素个数多于原先未修改数组中的元素个数,以数组元素类型为依据,int型则补0,str型补空字符" ",float型补0.,bool型补False。

  1. import numpy as np
  2. a = np.array([[1,2,3,4],
  3. [5,6,7,8]])
  4. b = np.array([[1,2,3,4],
  5. [5,6,7,8]])
  6. a.resize((2,2))
  7. a '''输出:array([[1,2]
  8. [3,4]])'''
  9. b.resize((4,3))
  10. b '''输出:array([[1, 2, 3],
  11. [4, 5, 6],
  12. [7, 8, 0],
  13. [0, 0, 0]])

ndarray.T

--- 数组的转置(有返回值)

  1. import numpy as np
  2. a = np.array([[1,2,3,4],
  3. [5,6,7,8]])
  4. a.T '''输出:array([[1, 5],
  5. [2, 6],
  6. [3, 7],
  7. [4, 8]])'''

flatten()方法

--- 返回折叠为一维的数组副本

  1. import numpy as np
  2. a = np.array([[1,2,3,4]
  3. [5,6,7,8]])
  4. a.flatten() #输出:array([1, 2, 3, 4, 5, 6, 7, 8])

ravel()方法

--- 返回一个扁平数组

  1. import numpy as np
  2. a = np.array([[1,2,3,4]
  3. [5,6,7,8]])
  4. a.ravel() #输出:array([1, 2, 3, 4, 5, 6, 7, 8])

flatten()与ravel()的区别

--- 两者所要实现的功能是一致的,区别在于返回拷贝还是返回试图。

--- flatten() 返回的是一份拷贝,对拷贝的修改不会影响原始矩阵。

--- ravel() 返回的是试图,会影响原始矩阵。

  1. import numpy as np
  2. a = np.array([[1,2,3,4]
  3. [5,6,7,8]])
  4. a.flatten()[0] = 100
  5. a '''输出:array([[1,2,3,4],
  6. [5,6,7,8]])'''
  7. a.ravel()[0] = 100
  8. a '''输出:array([[100,2,3,4],
  9. [5,6,7,8]])'''

astype()方法

--- astype(dtype)

--- 返回数组的副本,强制转换为指定类型。

  1. import numpy as np
  2. A = np.array([[1,2,3,4],
  3. [5,6,7,8]])
  4. A.astype(str) '''输出:array([['1', '2', '3', '4'],
  5. ['5', '6', '7', '8']], dtype='<U11')

tobytes() 或 tostring()

--- 构造包含数组中原始数据字节的python字节。

--- 两者没有区别,是同一方法的别名,tostring是为了向后兼容而保留的,推荐使用tobytes().
 

  1. import numpy as np
  2. A = np.array([[1,2,3,4],
  3. [5,6,7,8]])
  4. A.tobytes()
  5. ''' 输出: b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00' '''
  6. A.tostring()
  7. '''输出:b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00' '''

np.unique(ar,return_index=False,return_inverse=False,return_counts=False)

--- np.unique(ar,return_index=False,return_inverse=False,return_counts=False,后面三个参数为三个可选输出。

--- 数组去重,返回数组中唯一元素升序排序后的一维数组。

参数说明:

参数描述
ar数组名
return_index如果为True,返回去重后未排序时的数组的下标,默认为False
return_inverse如果为True,返回可用于重构‘ar’的唯一数组的索引,默认为True
return_counts如果为True,返回每个唯一项在'ar'中出现的次数
  1. import numpy as np
  2. A = np.array([[9,2,3,4],
  3. [5,6,7,8],
  4. [12,1,1,1]])
  5. np.unique(A, return_index=True, return_inverse=True, return_counts=True)
  6. '''输出:
  7. (array([1, 2, 3, 4, 5, 6, 7, 8]),
  8. array([0, 1, 2, 6, 4, 5, 3, 7], dtype=int64),
  9. array([0, 1, 2, 6, 4, 5, 3, 7, 7, 7, 7, 7, 6], dtype=int64),
  10. array([1, 1, 1, 1, 1, 1, 2, 5], dtype=int64))'''

数组中元素间的算术运算

  1. import numpy as np
  2. a = np.array([1,2,3,4,5,6,7,8])
  3. #加法运算
  4. a+1 #输出:array([2,3,4,5,6,7,8,9])
  5. #减法运算
  6. a-1 #输出:array([0,1,2,3,4,5,6,7])
  7. #乘法运算
  8. a*2 #输出:array([2,4,6,8,10,12,14,16])
  9. #除法运算
  10. a/2 #输出:array([0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. ])

数组间的算术运算

--- 此种情况需要当两个数组形状相同

  1. import numpy as np
  2. a = np.array([1,2,3,4,5,6,7,8])
  3. b = np.array([1,2,3,4,5,6,7,8])
  4. a+b #输出:array([ 2, 4, 6, 8, 10, 12, 14, 16])
  5. a-b #输出:array([0, 0, 0, 0, 0, 0, 0, 0])
  6. a*b #输出:array([ 1, 4, 9, 16, 25, 36, 49, 64])
  7. a/b #输出:array([1., 1., 1., 1., 1., 1., 1., 1.])

对数组按索引查询

基础索引

--- 一维数组(与python的List一致)

--- 二维数组

  1. import numpy as np
  2. a = np.array([[1,2,3,4],
  3. [5,6,7,8],
  4. [9,10,11,12],
  5. [13,14,15,16]])
  6. #分别用行坐标,列坐标实现行列筛选
  7. #有a[0,0] 和 a[0][0] 两种形式
  8. a[0,0] #输出:1
  9. a[-1,2] #输出:15
  10. #使用单个索引值,是选择索引某行
  11. a[2] #输出array([9,10,11,12])
  12. #索引多行
  13. a[:-2] #输出array([[1,2,3,4],[5,6,7,8]])
  14. #筛选多行,然后筛选多列
  15. a[:2,1:3] #输出:array([[2,3],[6,7]])
  16. #筛选某列
  17. a[:,1] #输出:array([2,6,10,14])
  18. #筛选多列
  19. a[:,1:3] #输出:array([[2,6,10,14],[3,7,11,15]])

--- 对整个切片的修改

  1. import numpy as np
  2. a = np.array([[1,2,3,4],
  3. [5,6,7,8],
  4. [9,10,11,12],
  5. [13,14,15,16]])
  6. a[:2] = 666 '''输出:array([[666,666,666,666],
  7. [666,666,666,666],
  8. [9,10,11,12],
  9. [13,14,15,16]])'''
  10. a[:2,1:3] = 666 '''输出:array([[1,666,666,3,4],
  11. [5,666,666,7,8],
  12. [9,10,11,12],
  13. [13,14,15,16]])'''

神奇索引

--- 使用整数数组作为索引,叫做神奇索引

一维数组

--- 可以根据用作索引的数组的不同维度形式,输出对应维度形式的数组

  1. import numpy as np
  2. a = np.array([12,7,6,5,5,3,2,1])
  3. #将一维数组用作索引,筛选指定位置的元素
  4. a[[2,7,4]] #输出:array([6, 1, 5])
  5. #将二维数组用作索引,筛选指定位置的元素,并以二维数组的形式输出
  6. index1 = np.array([[7,2,4],[1,2,3]]) '''注意:将二维数组用作索引时,不能直接使用
  7. List中的二维列表,需要ndarray数组对象'''
  8. '''输出:array([[1, 6, 5],
  9. [7, 6, 5]])'''

--- 获取数组中最大的前N个数,并按从小到大的顺序排列

  1. import numpy as np
  2. a = np.array([12,7,6,5,5,3,2,1])
  3. #获取数组中最大的前4个数
  4. a[a.argsort()[:-4]] #array([ 5, 6, 7, 12])

二维数组

  1. import numpy as np
  2. A = np.array([[9,2,3,4],
  3. [5,6,7,8],
  4. [12,1,1,1]])
  5. #筛选指定的多行,列可以省略
  6. A[[0,3]] '''输出:array([[ 9, 2, 3, 4],
  7. [12, 1, 1, 1]])'''
  8. #筛选指定的多列,行不能省略
  9. A[:,[1,3]] '''输出:array([[ 9, 2, 3, 4],
  10. [12, 1, 1, 1]]) '''
  11. #同时指定行与列,返回的是所有由具体的行列坐标指定的元素所组成的一维数组
  12. A[[1,2,0,1,1,1,1,1,2],[2,2,1,3,3,3,1,2,3]]
  13. #输出:array([7, 1, 2, 8, 8, 8, 6, 7, 1])

布尔索引

一维数组

  1. import numpy as np
  2. a = np.array([12,7,6,5,5,3,2,1])
  3. a>5 #array([ True, True, True, False, False, False, False, False])
  4. a[a>5] #array([12, 7, 6])

--- 实例:在数组中对满足一定条件的数进行整体修改

  1. import numpy as np
  2. a = np.array([12,7,6,5,5,3,2,1])
  3. #对大于5的数全部重新赋值为5
  4. a[a>5] = 5
  5. a #输出:array([5, 5, 5, 5, 5, 3, 2, 1])
  6. #对大于3的数全部自加20
  7. a[a>3] += 20
  8. a #输出:array([25, 25, 25, 25, 25, 3, 2, 1])

二维数组

  1. import numpy as np
  2. A = np.array([[1,2,3,4],
  3. [5,6,7,8],
  4. [9,10,11,12],
  5. [13,14,15,16,17]])
  6. A>5
  7. '''输出:array([[False, False, False, False],
  8. [False, True, True, True],
  9. [ True, True, True, True],
  10. [ True, True, True, True]])'''
  11. A[A>5]
  12. '''但此时返回的是一维数组
  13. 输出: array([ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])'''

--- 实例:以数组的某一列中所有元素为比较对象,筛选出满足一定条件的元素所在的行,或修改改行中所有元素的值

  1. import numpy as np
  2. A = np.array([[1,2,3,4],
  3. [5,6,7,8],
  4. [9,10,11,12],
  5. [13,14,15,16,17]])
  6. #筛选满足条件的指定行
  7. A[:,3]>8 #将筛选出来的某一列进行条件判断,返回的结果是一个一维数组,以此一维数组为索引条件,可以筛选出满足条件的行
  8. '''输出:array([False, False, True, True])'''
  9. A[A[:,3]>8]
  10. '''输出:array([[ 9, 10, 11, 12],
  11. [13, 14, 15, 16]])'''
  12. #修改筛选出来的行中的所有元素
  13. A[A[:,3]>8] = 999
  14. A
  15. '''输出:array([[ 1, 2, 3, 4],
  16. [ 5, 6, 7, 8],
  17. [999, 999, 999, 999],
  18. [999, 999, 999, 999]])

条件的组合索引

  1. import numpy as np
  2. #一维数组的条件组合索引
  3. a = np.array([12,7,6,5,5,3,2,1])
  4. condition = (a%2==0) | (a>5)
  5. a[condition]
  6. #输出: array([12, 7, 6, 2])
  7. #二维数组的条件组合索引,输出结果为一维数组
  8. A = np.array([[1,2,3,4],
  9. [5,6,7,8],
  10. [9,10,11,12],
  11. [13,14,15,16]])
  12. condition1 = (A%2==0) | (A>5)
  13. A[condition1]
  14. #输出:array([ 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])

常用的random随机函数

seed(seed=None)

--- 设定随机种子,随机数种子一般是一个整数,只要种子相同,每次生成的随机数序列也相同。

  1. import numpy as np
  2. np.random.seed(44)
  3. a = np.random.rand() #输出:0.8348421486656494
  4. np.random.seed(44)
  5. b = np.random.rand() #输出:0.8348421486656494
  6. #可以看到由于设置的随机数种子相同,生成的随机数也相同

rand(d0, d1, ..., dn)

--- 参数为整数,表示生成数组的形状。

--- 创建一个给定形状的数组,并在' '[0,1)' '上按均匀分布填充随机样本。

  1. import numpy as np
  2. #生成一个随机数
  3. a = np.random.rand() #输出:0.8348421486656494
  4. #生成一个一维的随机数组
  5. b = np.random.rand(4) #输出:array([0.85368225, 0.67560617, 0.03768029, 0.30894783])
  6. c = np.random.rand(3) #输出:array([0.56424949, 0.59407763, 0.68081341])
  7. #生成一个多维的随机数组
  8. d = np.random.rand(4,3)
  9. '''输出:array([[0.63243183, 0.93870249, 0.73711959],
  10. [0.74485551, 0.1088856 , 0.49363527],
  11. [0.86675104, 0.01825511, 0.18290372],
  12. [0.11267988, 0.85329766, 0.04845415]])'''

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/968860
推荐阅读
相关标签
  

闽ICP备14008679号