numpy study
0x01:n维数组对象ndaarray
存放同类型元素的多维数组
0x02:numpy数据类型
numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。
字定义结构化数据类型:
import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print(a)
0x03:数组的属性
ndarray.ndim: 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
NumPy 也提供了 reshape 函数来调整数组大小。
a = np.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print (b)
0x04:创建数组
numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:
x = np.empty([3,2], dtype = int)
print (x)
numpy.zeros/ones 创建指定大小的数组,数组元素以 0/1 来填充:
x = np.zeros(5)
print(x)
x = np.ones(5)
print(x)
0x05:从已有的数组中创建数组
umpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个。
numpy.asarray(a, dtype = None, order = None)
a 任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组
dtype 数据类型,可选
order 可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
0x06:从数值范围创建数组
numpy 包中的使用 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下:
numpy.arange(start, stop, step, dtype)
numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
umpy.logspace 函数用于创建一个于等比数列。格式如下:
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
0x07:切片和索引
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
a = np.arange(10)
s = slice(2,7,2) # 从索引 2 开始到索引 7 停止,间隔为2
print (a[s])
冒号 : 的解释:如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。如果为 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。
import numpy as np
a = np.arange(10)
print(a[2:])
多维数组同样适用上述索引提取方法:提取出的为某一行之后的数组
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print(a)
# 从某个索引处开始切割
print('从数组索引 a[1:] 处开始切割')
print(a[1:])
0x08:高级索引
整数数组索引:两个数组对应元素映射确定一个位置
以下实例获取数组中(0,0),(1,1)和(2,0)位置处的元素。
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print (y)
0x09:numpy广播
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a * b
print (c)
输出结果为:
[ 10 40 90 160]
当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。如:
a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
print(a + b)
输出结果为:
[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
4x3 的二维数组与长为 3 的一维数组相加,等效于把数组 b 在二维上重复 4 次再运算:
0x10:迭代数组
NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。
迭代器最基本的任务的可以完成对数组元素的访问。
接下来我们使用 arange() 函数创建一个 2X3 数组,并使用 nditer 对它进行迭代。
实例
a = np.arange(6).reshape(2,3)
print ('原始数组是:')
print (a)
print ('\n')
print ('迭代输出元素:')
for x in np.nditer(a):
print (x, end=", " )
print ('\n')
控制遍历顺序:
for x in np.nditer(a, order='F'):Fortran order,即是列序优先;
for x in np.nditer(a.T, order='C'):C order,即是行序优先;
修改数组中元素的值
nditer 对象有另一个可选参数 op_flags。 默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定 read-write 或者 write-only 的模式。
实例
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print ('原始数组是:')
print (a)
print ('\n')
for x in np.nditer(a, op_flags=['readwrite']):
x[...]=2*x
print ('修改后的数组是:')
print (a)
输出结果为:
原始数组是:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
修改后的数组是:
[[ 0 10 20 30]
[ 40 50 60 70]
[ 80 90 100 110]]
0x11:数组操作
Numpy 中包含了一些函数用于处理数组,大概可分为以下几类:修改数组形状、翻转数组、修改数组维度、连接数组、分割数组、数组元素的添加与删除
numpy.reshape 函数可以在不改变数据的条件下修改形状
,格式如下: numpy.reshape(arr, newshape, order='C')
numpy.ndarray.flat 是一个数组元素迭代器
,实例如下:
import numpy as np
a = np.arange(9).reshape(3,3)
print ('原始数组:')
for row in a:
print (row)
# 对数组中每个元素都进行处理,可以使用flat属性,该属性是一个数组元素迭代器:
print ('迭代后的数组:')
for element in a.flat:
print (element)
输出结果如下:
原始数组:
[0 1 2]
[3 4 5]
[6 7 8]
迭代后的数组:
0
1
2
3
4
5
6
7
8
flat方法与前面nditer不同的是,nditer是numpy中的一个方法,且默认是只读对象,而flat方法是数组对象的方法。
numpy.ravel() 展平的数组元素
,顺序通常是"C风格",返回的是数组视图(view,有点类似 C/C++引用reference的意味),修改会影响原始数组。可以简单的理解成把多为数组转换成一维数组
该函数接收两个参数:
numpy.ravel(a, order='C')
numpy.transpose 函数用于对换数组的维度
,行变列,格式如下:
numpy.transpose(arr, axes)
参数说明:
arr:要操作的数组
axes:整数列表,对应维度,通常所有维度都会对换。
numpy.ndarray.T 类似 numpy.transpose
:列变行
numpy.swapaxes 函数用于交换数组的两个轴,格式如下:
numpy.swapaxes(arr, axis1, axis2)
arr:输入的数组
axis1:对应第一个轴的整数
axis2:对应第二个轴的整数
连接数组
|函数|描述|
|:--|:|
|concatenate|连接沿现有轴的数组序列|
|stack|沿着新的轴加入一系列数组|
|hstack|水平堆叠序列中的数组(列方向)|
|vstack|竖直堆叠序列中的数组(行方向)|
分割数组
|函数| |数组及操作|
|:|:|
|split| 将一个数组分割为多个子数组
|hsplit| 将一个数组水平分割为多个子数组(按列)
|vsplit |将一个数组垂直分割为多个子数组(按行)
数组元素的添加与删除
|函数 |元素及描述
|:|:|
|resize |返回指定形状的新数组
|append |将值添加到数组末尾
|insert |沿指定轴将值插入到指定下标之前
|delete |删掉某个轴的子数组,并返回删除后的新数组
|unique |查找数组内的唯一元素
0x12:numpy位运算
NumPy "bitwise_" 开头的函数是位运算函数。
NumPy 位运算包括以下几个函数:
|函数|描述
|:|:|
|bitwise_and|对数组元素执行位与操作
|bitwise_or |对数组元素执行位或操作
|invert |按位取反
|left_shift |向左移动二进制表示的位
|right_shift|向右移动二进制表示的位
0x13:numpy字符串函数
以下函数用于对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作。 它们基于 Python 内置库中的标准字符串函数。这些函数在字符数组类(numpy.char)中定义。
|函数 |描述
|:|
|add() |对两个数组的逐个字符串元素进行连接,元素之间进行映射
|multiply() |返回按元素多重连接后的字符串,把一个字符串返回多次
|center() |居中字符串,并使用指定字符在左侧和右侧进行填充。
|capitalize() |将字符串第一个字母转换为大写
|title() |将字符串的每个单词的第一个字母转换为大写
|lower() |对数组的每个元素转换为小写。它对每个元素调用 str.lower。
|upper() |函数对数组的每个元素转换为大写。它对每个元素调用 str.upper。
|split() |通过指定分隔符对字符串进行分割,并返回数组。默认情况下,分隔符为空格。
|splitlines() |函数以换行符作为分隔符来分割字符串,并返回数组。
|strip() |移除元素开头或者结尾处的特定字符
|join() |通过指定分隔符来连接数组中的元素
|replace() |使用新字符串替换字符串中的所有子字符串
|decode() |数组元素依次调用str.decode
|encode() |数组元素依次调用str.encode
0x14:numpy的数学计算
NumPy 包含大量的各种数学运算的函数,包括三角函数,算术运算的函数,复数处理函数等.
三角函数:NumPy 提供了标准的三角函数
:sin()、cos()、tan()。
numpy.around() 函数返回指定数字的四舍五入值
。
numpy.around(a,decimals)
参数说明:
a: 数组
decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
numpy.floor() 返回数字的下舍整数。
numpy.ceil() 返回数字的上入整数。
0x15:numpy的算术函数
NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide()。
print ('两个数组相加:')
print (np.add(a,b))
print ('两个数组相减:')
print (np.subtract(a,b))
print ('两个数组相乘:')
print (np.multiply(a,b))
print ('两个数组相除:')
print (np.divide(a,b))
numpy.reciprocal() 函数返回参数逐元素的倒数
。如 1/4 倒数为 4/1。
a = np.array([0.25, 1.33, 1, 100])
print ('我们的数组是:')
print (a)
print ('\n')
print ('调用 reciprocal 函数:')
print (np.reciprocal(a))
numpy.power() 函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂
。
numpy.mod() 计算输入数组中相应元素的相除后的余数。 函数 numpy.remainder() 也产生相同的结果。
参数是两个数组,第一个数组里的元素做被除数,返回一个余数组成的数组
0x16:numpy统计函数
NumPy 提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等:
numpy.amin() 用于计算数组中的元素沿指定轴的最小值。1表示一行中最小,0表示一列中最小 空表示数组中最小
numpy.amax() 用于计算数组中的元素沿指定轴的最大值。
a = np.array([[3,7,5],[8,4,3],[2,4,9]])
print (a)
print (np.amin(a,1))
print (np.amin(a,0))
print (np.amax(a))
print (np.amax(a, axis = 0))
mpy.ptp()函数计算数组中元素最大值与最小值的差(最大值 - 最小值)
print ('调用 ptp() 函数:')
print (np.ptp(a))
print ('沿轴 1 调用 ptp() 函数:')
print (np.ptp(a, axis = 1))
print ('沿轴 0 调用 ptp() 函数:')
print (np.ptp(a, axis = 0))
numpy.median() 函数用于计算数组 a 中元素的中位数(中值):按行、列或整个数组计算
numpy.mean() 函数返回数组中元素的算术平均值:按行、列或整个数组计算
numpy.average() 函数根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值。
0x17:numpy排序、条件筛选函数
排序算法:'quicksort'(快速排序) 'mergesort'(归并排序) 'heapsort'(堆排序)
numpy.sort() 函数
返回输入数组的排序副本。函数格式如下:
numpy.sort(a, axis, kind, order)
参数说明:
a: 要排序的数组
axis: 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序, axis=0 按列排序,axis=1 按行排序
kind: 默认为'quicksort'(快速排序)
order: 如果数组包含字段,则是要排序的字段
numpy.argsort() 函数返回的是数组值从小到大的索引值。
numpy.argmax() 和 numpy.argmin()函数分别沿给定轴返回最大和最小元素的索引。
numpy.where() 函数返回输入数组中满足给定条件的元素的索引。
numpy.extract() 函数根据某个条件从数组中抽取元素,返回满条件的元素。
0x18:numpy矩阵库(matrix)
matlib.empty() 函数返回一个新的矩阵,语法格式为:
numpy.matlib.empty(shape, dtype, order)
参数说明:
shape: 定义新矩阵形状的整数或整数元组
Dtype: 可选,数据类型
order: C(行序优先) 或者 F(列序优先)
import numpy.matlib
import numpy as np
print (np.matlib.empty((2,2)))
- numpy.matlib.zeros() 函数创建一个以 0 填充的矩阵。
- numpy.matlib.ones()函数创建一个以 1 填充的矩阵。
- numpy.matlib.rand() 函数创建一个给定大小的矩阵,数据是随机填充的。
- numpy.matlib.identity() 函数返回给定大小的单位矩阵。单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为 1,除此以外全都为 0。
numpy.matlib.eye() 函数返回一个矩阵,对角线元素为 1,其他位置为零。
numpy.matlib.eye(n, M,k, dtype)
参数说明:
n: 返回矩阵的行数
M: 返回矩阵的列数,默认为 n
k: 对角线的索引
dtype: 数据类型
实例:
import numpy.matlib
import numpy as np
print (np.matlib.eye(n = 3, M = 4, k = 0, dtype = float))
0x19:numpy线性代数
NumPy 提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能,可以看看下面的说明:
|函数 |描述
|:|
|dot |两个数组的点积,即元素对应相乘。
|vdot |两个向量的点积
|inner ||两个数组的内积
|matmul |两个数组的矩阵积
|determinant |数组的行列式
|solve |求解线性矩阵方程
|inv |计算矩阵的乘法逆矩阵
numpy 和 matplotlib
from matplotlib import pyqlot as plt
plt.title 图形标题
plt.xlable x轴标题
plt.ylable y轴标题
plt.plot(x, y) 画图
plt.show() 显示图
plt.hist
subplot() 函数
允许你在同一图中绘制不同的东西,就是说可以把一块画布分为若干个子画布,在子画布画不同的东西。子画布能分多少。取决于为子画布设置的高和宽。函数需要三个参数,第一个是子画布的高,第二个是子画布的宽,第三个是子画布的序号。子画布的实际高和宽是你设置高和宽的倒数,加入设置高为4,宽为2,那么子画布的实际高和宽就是整个画布的1/4 1/2,高和宽设置的越小,子画布分数量越多。所有子画布的高或宽不能超过1
bar() 函数来生成条形图:传入的两个数组元素数量必须相等,具有画图功能,代替上面的plt.plot
numpy.histogram() 函数是数据的频率分布的图形表示。 水平尺寸相等的矩形对应于类间隔,称为 bin,变量 height 对应于频率。
numpy.histogram()函数将输入数组和 bin 作为两个参数。 bin 数组中的连续元素用作每个 bin 的边界。