Numpy

Posted wzos

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Numpy相关的知识,希望对你有一定的参考价值。

数据分析:是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律

numpy 简介

NumPy(Numerical Python)是Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

ndarray 创建数组

shift + Tab 打开帮助文档

  • 一维数组np.array(序列) 序列可为任意容器形数据类型及 range() 对象
np.array([1, 2, 3])    # 列表转换为数组
# [1, 2, 3]
  • 二维数组np.array(序列嵌套) 容器嵌套几层就是几维
np.array([[1, 2, 3], [4, 5, 6]])
# [[1, 2, 3]
#  [4, 5, 6]]

注意:numpy默认数组的所有元素的类型是相同的,如果传进来的序列中包含不同的类型,则强转为同一类型,优先级:str > float > int


  • 等差数组np.arange(start, stop, step, dtype=None)(类似range)
    • start(可选):起始值,默认值为 0
    • stop:结束值,实际取值要 +1
    • step(可选):步长值,设浮点型小数,默认值为 1
单值:np.arange(5) 			# [0 1 2 3 4]
双值:np.arange(1, 10, 2)		# [1 3 5 7 9]
三值:np.arange(2, 0, -0.5)	# (6, 5, 4)
  • 等差数列:在指定的间隔内返回均匀间隔的数字

    语法np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

    • start:序列的起始点
    • stop:序列的终点,实际取值要 +1
    • num(可选):生成的样本数,默认值 50
    • endpoint(可选):属性设置是否包括结束值,endpoint=False不包括,默认True包括
    • retstep:如果为真,则返回(数组,步长)
    • dtype(可选):输出数组的类型,如果未给定dtype,则从其他输入参数中推断数据类型
np.linspace(0, 10, 10, endpoint=False)
# [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]

  • zeros 全0 、ones 全1数组
    • 全0的一维数组:np.zeros(列)
    • 全0的二维数组:np.zeros((行, 列))
np.zeros(3)		# [0. 0. 0.]
np.zeros((2,3))
# [[0. 0. 0.]
#  [0. 0. 0.]]
  • 单位矩阵:返回一个n行 * n列的对角阵,对角线元素为1,其余为0
np.identity(3)	# 三行三列
# [[1. 0. 0.]
#  [0. 1. 0.]
#  [0. 0. 1.]]
  • 随机数组np.random.randint(low, high=None, size=None, dtype=‘int‘)
    • low:随机范围的最小值
    • high:随机范围的最大值
    • size:范围的个数,可设为指定行列
np.random.randint(0, 50, (2,4))
# [[13  7 34 43]
#  [15 43 31 48]]
np.random.random((2,3))	# 随机0到1之间,指定两行三列
# [[0.56344919 0.82741278 0.35153991]
#  [0.83255027 0.86214153 0.61376901]]


ndarray的索引切片

使用下标和切片形式来访问数组中的某个或多个元素

  • 索引:用于非连贯性的元素取值

取单行:[行]

取指定多行:[[行, 行]]

取单元素:[行][列] 等价 [行, 列]

取多个元素:[[行,行],[列,列]](一个行对应一个列)

a = np.array(([1,2,3],[4,5,6],[7,8,9]))
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
a[0]		# [1 2 3]
a[0][2]     # 3
a[0,2]		# 3
a[[0,2,1],[2,1,0]]     # [3 8 4]
a[[0,2]]	# 取第一行和最后一行
  • 切片:用于有规律或连贯性的元素取值(切片尾索引要 +1)

取行:[行:行] (几行到几行)

取切块:[行:行,列:列](以逗号分隔维度,左边行切片,右边列切片)

嵌套切片:[[行,行],列:列]

a = np.array(([1,2,3],[4,5,6],[7,8,9]))
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
a[:2]		# 取前两行
a[:,2]		# 取最后一列
a[1:,:2]	# 取第二列
a[[0,2],1:]	# 混合嵌套索引加切片
# [[2 3]
#  [8 9]]
  • 步长:同切片逗号机制,一维数组操作同列表切片

行倒序:[::-1](所有行位置反转,列元素反转)

列倒序:[:,::-1](所有列位置反转,行元素反转)

全部倒叙:[::-1,::-1](按对角线反转)

a = np.array(([1,2,3],[4,5,6],[7,8,9]))
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
a[[0,2],::2]	# 指定行,列切片步长
# [[1 3]
#  [7 9]]
a[::2,[0,2]]	# 行切片步长,指定列
# [[1 3]
#  [7 9]]

naarray的元素增改

  • 追加np.arange(a, 元素)
  • 插入np.insert(a, 索引, 元素)

注意:都返回为新数组;可增加多个元素写为[元素,元素] ;如果是二维数组则合并成一维数组后再增加

a = np.arange(8)      # [0,1,2,3,4,5,6,7]
np.append(a,8)      	# 追加单元素8
np.append(a,[9,10])     # 追加9和10
np.insert(a,2,[4,5])	# 在索引2插入4和5
  • 修改:使用下标的形式修改原数组的元素值
a = np.array([[1,2,3],[4,5,6]])
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
a[0,2] = 9		# 改第0行第2列的元素为9
a[1:,1:] = [1,2]	# 修改的元素对应复用
# [[1 2 3]
#  [4 1 2]
#  [7 1 2]]
a[1:,1:] = [1,2],[3,4]	# 改为二维数组对应的值
# [[1 2 3]
#  [4 1 2]
#  [7 3 4]]

ndarray的常用操作

ndarray的属性

维度:a.ndim(返回数组是几维)

形状:a.shape(返回一个元组:(行, 列, 维度))

总长度:a.size

元素类型:a.dtype(int32表示32位的整型)

排序求值

axis:0 求每列的和,1 求每行的和,默认所有元素(以下参数同可使用)

  • 求和:a.sum(axis=None)
  • 最大最小值:a.max()/a.min()
  • 平均值:a.mean()
  • 排序:a.sort()(升序)

其他操作

  • 最大值、最小值元素的下标:a.argmax()/a.argmin()
  • 返回排序后元素的原下标:a.argsort()(从小到大)

改变数组的形状

注意:必须匹配现有元素的个数

  • 改变原数组:a.shape = 行, 列(-1表示自动计算,行与列只能有一个)
  • 返回新数组:a.reshape(行, 列) 单参数为行
a = np.arange(1,9)		# [ 1  2  3  4  5  6  7  8]
a1 = a.reshape(-1,4)	# 行自动计算,指定4列
# [[1 2 3 4]
#  [5 6 7 8]]

改变数组的形状进行增减元素

  • 改变原数组:a.resize(行, 列)(元素不够用零补充)
  • 返回新数组:np.resize(a, (行, 列))(元素不够用循环原元素补充)
a = np.array([[1, 2, 3], [4, 5, 6]])
np.resize(a,(3,4))		# 循环原始数据补充
# [[1 2 3 4]
#  [5 6 1 2]
#  [3 4 5 6]]

数组转置b.T(使原先的行变成列,一维数组不变)

b = np.array(([1,2,3],[4,5,6],[7,8,9]))
# [[1 2 3]			# [[1 4 7]
#  [4 5 6]	  -->	#  [2 5 8]
#  [7 8 9]]			#  [3 6 9]]

数组的级联np.concatenate((a1,a2),axis=1)

  • a:两个数组
  • axis:级联的轴向(0:与列拼接,1:与行拼接)
a = np.random.randint(10, 50, (2,3))
# [[13 17 34]
#  [15 43 31]]
np.concatenate((a,a),axis=1) 
# [[13 17 34 13 17 34]
#  [15 43 31 15 43 31]]

注意

  • 维度必须相同

  • 级联的参数是列表:一定要加中括号或小括号

  • 形状相符:在维度保持一致的前提下,如果进行与行级联,俩的数组行数必须一致,列亦是


数组的运算

所有算数运算符都可使用,可返回新数组

  • 数组与标量的运算:分别对每个元素进行运算
a = np.array([[1,2,3],[4,5,6]])
a - 2			# 每一位都减2
# [[-1  0  1]
#  [ 2  3  4]]
2 ** a			# 分别计算每一位
# [[ 2  4  8]
#  [16 32 64]]
  • 数组与数组的运算
    • 等长数组相运算:返回新数组为两个数组对应位置上元素相运算的结果
    • 不等长数组相运算:只允许单元素数组(同与标量运算)
a = np.array([1,2,3,4])	# [1,2,3,4]
a + a	# [5 5 5 5]
a ** a	# [1 4 9 16]
a * np.array([2])	# [2 4 6 8]

  • 数组的内积运算

内积:两数组互与对应位上的数相乘,所有位上的乘积相加的和

计算两个数组的内积:np.dot(数组1, 数组2)

x = np.array((1,2,3))
y = np.array((4,5,6))
print(np.dot(x, y))		# 32
print(sum(x * y))		# 32

测试元素

测试两个数组的对应元素是否足够接近:测试两个数组中对应位置上元素在允许的误差范围内是否相等,并可以接收绝对误差参数和相对误差参数

  • isclose():函数用来测试每一对元素是否相等并返回包含若干True/False的列表

  • allclose():函数用来测试所有对应位置上的元素是否都相等并返回单个True或False

    语法isclose(a1, a2, rtol=1e-05, atol=1e-08)(allcolse同语法)

    • a:两个数组

    • rtol:设置相对误差参数

    • atol:设置绝对误差参数

x=np.array([1,2,3,4.001,5])
y=np.array([1,1.999,3,4.01,5.1])
np.allclose(x,y)            # false
np.allclose(x,y,rtol=0.2)   # True
np.isclose(x,y)  # [ True False True False False]
np.isclose(x,y,atol=0.2)    # [ True  True  True  True  True]

以上是关于Numpy的主要内容,如果未能解决你的问题,请参考以下文章

'numpy.ndarray':对象不可调用错误

乐哥学AI_Python:Numpy索引,切片,常用函数

对数据进行去均值并转换为 numpy 数组

Jax 矢量化:vmap 和/或 numpy.vectorize?

微信小程序代码片段

VSCode自定义代码片段——CSS选择器