参考学习文献:https://www.numpy.org.cn/article/basics/python_numpy_tutorial.html
https://www.machinelearningplus.com/python/101-numpy-exercises-python/
1.什么是Numpy?
-
NumPy是Python中科学计算的基础软件包。
-
Numpy提供多维数组对象,多种派生对象(如:掩码数组、矩阵)以及用于快速操作数组的函数及API,
-
Numpy包括数学、逻辑、数组形状变换、排序、选择、I/O 、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等。
-
NumPy包的核心是ndarray对象。
2.数组对象ndarray
-
Numpy的数组类被称为ndarray,别名为 array。
-
Numpy的数组中所有元素类型都相同,并通过正整数元组索引。
-
Numpy中,维度称为轴。轴的数目为rank。
3.创建ndarray数组
1)基于 list 或 tuple
# 基 于 list
arr1 = np.array([1,2,3,4])
print(arr1)
# 基 于 tuple
arr_tuple = np.array((1,2,3,4))
print(arr_tuple)
在创建二维数组时,在每个子 list 外面还有一个“[]”,形式为“[[list1], [list2]]”
2)基于 np.arange
# 一 维 数 组
arr1 = np.arange(5)
print(arr1)
# 二 维 数 组
arr2 = np.array([np.arange(3), np.arange(3)])
arr2
>>>输出结果:
[0 1 2 3 4]
array([[0, 1, 2],
[0, 1, 2]])
3)基于 arange 以及 reshape 创建多维数组
# 创 建 三 维 数 组
arr = np.arange(24).reshape(2,3,4)
4)基于 random
4.ndarray 数组的属性
1)dtype 属性,数组数据类型
dtype 属性,ndarray 数组的数据类型,数据类型的种类
np.arange(4, dtype=float)
# 'D' 表 示 复 数 类 型
np.arange(4, dtype='D')
2)ndim 属性,数组维度的数量
a = np.array([[1,2,3], [7,8,9]])
a.ndim
>>>输出结果:
2
3)shape 属性,数组对象的尺度,对于矩阵,即 n 行 m 列,shape 是一个元组(tuple)
a.shape
>>>输出结果:
(2, 3)
4)size 属性用来保存元素的数量,相当于 shape 中 num 的值
a.size
>>>输出结果:
6
5)itemsize 属性返回数组中各个元素所占用的字节数大小
a.itemsize
>>>输出结果:
4
6)T 属性,数组转置
b = np.arange(24).reshape(4,6)
b.T
7)flat 属性,返回一个 numpy.flatiter 对象,即可迭代的对象。
e = np.arange(6).reshape(2,3)
for item in e:
print(item)
>>>输出结果:
0
1
2
3
4
5
5.处理数组形状
1)resize与reshape
函数 resize()的作用跟 reshape()类似,但是会改变所作用的数组,相当于有 inplace=True 的效果
2)ravel与flatten
ravel() 和 flatten(),将多维数组转换成一维数组,两者的区别在于返回拷⻉(copy)还是返回视图(view) ,flatten() 返回一份拷⻉,需要分配新的内存空间,对拷⻉所做的修改不会影响原始矩阵,而ravel() 返回的是视图(view),会影响原始矩阵。
6.元素迭代
import numpy as np
a = np.arange(6).reshape(2,3)
for x in np.nditer(a):
print (x, end=", " )
=================================================
for row in a:
print (row)
=================================================
for element in a.flat:
print (element,end = ",")
7.数组连接
- numpy.concatenate:用于沿指定轴连接相同形状的两个或多个数组
numpy.concatenate((a1, a2, ...), axis)
# a1, a2, ...:相同类型的数组
# axis:沿着它连接数组的轴,默认为 0
- numpy.stack:用于沿新轴连接数组序列
numpy.stack((a1,a2, ...),axis)
- numpy.hstack 是 numpy.stack 函数的变体,它通过水平堆叠来生成数组。
- numpy.vstack 是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组。
8.数组分割
- numpy.split:沿特定的轴将数组分割为子数组
numpy.split(ary, indices_or_sections, axis)
# ary:被分割的数组;
# indices_or_sections:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭);
# axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分。
- numpy.hsplit:用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组。
- numpy.vsplit:用于垂直轴分割,其分割方式与hsplit用法相同。
9.数组操作
1)新增
- numpy.append:函数在数组的末尾添加值。
追加操作会分配整个数组,并把原来的数组复制到新数组中。
append 函数返回的始终是一个一维数组。
numpy.append(arr, values, axis=None)
# arr:输入数组
# values:要向arr添加的值,需要和arr形状相同(除了要添加的轴)
# axis:默认为 None。当axis无定义时,是横向加成,返回总是为一维数组!当axis有定义的时候,分别为0和1的时候。
当axis有定义的时候,分别为0和1的时候(列数要相同)。当axis为1时,数组是加在右边(行数要相同)。
- numpy.insert:函数在给定索引之前,沿给定轴在输入数组中插入值。
如果值的类型转换为要插入,则它与输入数组不同。 插入没有原地的,函数会返回一个新数组。
此外,如果未提供轴,则输入数组会被展开。
numpy.insert(arr, obj, values, axis)
# arr:输入数组
# obj:在其之前插入值的索引
# values:要插入的值
# axis:沿着它插入的轴,如果未提供,则输入数组会被展开
2)删除
- numpy.delete:函数返回从输入数组中删除指定子数组的新数组。
与 insert() 函数的情况一样,如果未提供轴参数,则输入数组将展开。
numpy.delete(arr, obj, axis)
# arr:输入数组
# obj:可以被切片,整数或者整数数组,表明要从输入数组删除的子数组
# axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开
3)去重
- numpy.unique:函数用于去除数组中的重复元素。
numpy.unique(arr, return_index, return_inverse, return_counts)
# arr:输入数组,如果不是一维数组则会展开
# return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储
# return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储
# return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数
11.字符串函数
函数 |
描述 |
输入 |
输出 |
---|---|---|---|
add() |
对两个数组的逐个字符串元素进行连接 | print (np.char.add(['hello'],[' xyz'])) | ['hello xyz'] |
print (np.char.add(['hello', 'hi'],[' abc', ' xyz'])) | ['hello abc' 'hi xyz'] | ||
multiply() | 返回按元素多重连接后的字符串 |
print (np.char.multiply('Runoob ',3))
|
Runoob RunoobRunoob |
center() |
居中字符串 | print (np.char.center('Runoob', 20,fillchar = '*')) | *******Runoob******* |
capitalize() |
将字符串第一个字母转换为大写 | print (np.char.capitalize('runoob')) | Runoob |
title() |
将字符串的每个单词的第一个字母转换为大写 | print (np.char.title('i like runoob')) | I Like Runoob |
lower() |
数组元素转换为小写 | print (np.char.lower('RUNOOB')) | runoob |
upper() |
数组元素转换为大写 | print (np.char.upper('runoob')) | RUNOOB |
split()
|
指定分隔符对字符串进行分割,并返回数组列表 | print (np.char.split ('i like runoob?')) # 默认分隔符为空格 | ['i', 'like', 'runoob?'] |
print (np.char.split ('www.runoob.com', sep = '.')) # 设置分隔符为“.”
|
['www', 'runoob','com'] |
||
splitlines() |
返回元素中的行列表,以换行符分割 | print (np.char.splitlines('i like runoob?')) # , , 都可用作换行符 | ['i', 'like runoob?'] |
strip()
|
移除元素开头或者结尾处的特定字符 | print (np.char.strip('ashok arunooba','a')) #移除字符串头尾的 a 字符 | shok arunoob |
print (np.char.strip(['arunooba','admin','java'],'a')) #移除数组元素头尾的 a 字符 | ['runoob' 'dmin' 'jav'] | ||
join()
|
通过指定分隔符来连接数组中的元素 | print (np.char.join(':','runoob')) # 操作字符串 | r:u:n:o:o:b |
print (np.char.join([':','-'],['runoob','google'])) # 指定多个分隔符操作数组元素 | ['r:u:n:o:o:b' 'g-o-o-g-l-e'] | ||
replace() |
使用新字符串替换字符串中的所有子字符串 | print (np.char.replace ('i like runoob', 'oo', 'cc')) | i like runccb |
decode() |
数组元素依次调用str.decode |
print(np.char.encode('runoob', 'cp500')) | b'x99xa4x95x96x96x82' |
encode() |
数组元素依次调用str.encode |
print (np.char.decode(np.char.encode('runoob', 'cp500'),'cp500')) | runoob |
12.数学函数
三角函数:sin()、cos()、tan()
反三角函数:arcsin()、arccos()、arctan()
弧度换算角度:numpy.degrees()
舍入函数:numpy.around(a,decimals)
# a 输入数组
# decimals 要舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
numpy.floor():返回数字的下舍整数。
numpy.ceil():返回数字的上入整数。
13.算术运算
加法:add()
减法:subtract()
乘法:multiply()
除法:divide()
倒数:numpy.reciprocal()
- numpy.power() # 此函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。
- numpy.mod() # 此函数返回输入数组中相应元素的除法余数。
- numpy.real() # 返回复数类型参数的实部。
- numpy.imag() # 返回复数类型参数的虚部。
- numpy.conj() # 返回通过改变虚部的符号而获得的共轭复数。
- numpy.angle() # 返回复数参数的角度。 函数的参数是degree。 如果为true,返回的角度以角度制来表示,否则为以弧度制来表示。
14.统计函数
- numpy.amin() # 从给定数组中的元素沿指定轴返回最小值。
- numpy.amax() # 从给定数组中的元素沿指定轴返回最大值。
- numpy.ptp() # 返回沿轴的值的范围(最大值 - 最小值)。
- numpy.percentile() # 百分位数是统计中使用的度量,表示小于这个值得观察值占某个百分比。
numpy.percentile(a, q, axis)
# a 输入数组
# q 要计算的百分位数,在 0 ~ 100 之间
# axis 沿着它计算百分位数的轴
- numpy.median() # 中值
- numpy.mean() # 函数返回数组中元素的算术平均值。
- numpy.average() # 函数根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值。
# 如果 returned 参数设为 true,则返回权重的和
np.average([1,2,3,4],weights = [4,3,2,1], returned = True)
- numpy.std()标准差
- numpy.var()方差
15.排序
种类 |
速度 |
最坏情况 |
工作空间 |
稳定性 |
---|---|---|---|---|
|
1 |
|
0 |
否 |
|
2 |
|
~n/2 |
是 |
|
3 |
|
0 |
否 |
函数:
- numpy.sort() # 函数返回输入数组的排序副本。
numpy.sort(a, axis, kind, order)
# a 要排序的数组
# axis 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序
# kind 默认为'quicksort'(快速排序)
# order 如果数组包含字段,则是要排序的字段。
- numpy.argsort() # 函数返回的是数组值从小到大的索引值。
- numpy.lexsort() # 用于对多个序列进行排序。把它想象成对电子表格进行排序,每一列代表一个序列,排序时优先照顾靠后的列。
- numpy.argmax() # 返回沿给定轴返回最大元素的索引。
- numpy.argmin() # 返回沿给定轴返回最小元素的索引。
- numpy.nonzero() # 函数返回输入数组中非零元素的索引。
- numpy.where() # 函数返回输入数组中满足给定条件的元素的索引。
- numpy.extract(condition, x) # 函数返回满足任何条件的元素。