备注:第一次学习python,有错误的地方希望大家指正
Numpy
Numpy是一个使用python进行科学计算的基础包,包含内容有:
- 强大的N维数组对象
- 复杂的(广播)功能
- 用于集成C/C++和Fortran代码的工具
- 有用的线性代数,傅里叶变换和随机数功能
除了明显的科学用途外,Numpy还可以用作通用数据的高效多维容器。可以定义任意数据类型。这使Numpy能够无缝快速地与各种数据库集成
一.基础知识:
Numpy的主要对象是同构多维数组,它是一个元素表(通常是数字),都是相同类型的数据,由正整数元组索引。在Numpy中纬度称为轴,轴的数量被称为级。
什么是数组:
所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。
什么是多维数组:
一维数组:容易理解 就是一个大箱子 里面有许多元素
如a[3] 这就是一个装有三个元素的箱子
二维数组: 就是一维数组的数组
如 a[3][4] 有三个装着四个元素的箱子
三维数组 :2维的图形就是一个平面,而3维的图新就是一个立体图形,3维比2维多了一个 z 轴。。 如果把它们的区别实体化,那么你可以理解为 :一个正方形 和 一个正方体 的区别了
举个例子:
3D空间中点的坐标[1,2,3]这就具有一个轴。该轴有3个元素。所以我们说他的长度是3。下图中的例子
中数组有两个轴,第一个纵向轴为2,第二个横向轴为3
Numpy的数组被调用ndarry,他也被别名所知array。Numpy.array与标注python库类不同array.array,后者仅处理一组数组并提供较少功能,而ndarry对象更重要的属性是:
Ndarry.ndim:阵列的轴数
Ndarry.shape:数组的大小。这是一个整数元组,表示每个维度中数组的大小。对于具有n行和m列的矩阵,shape将是(n,m)。shape因此,元组的长度 是轴的数量ndim。
ndarray.size:数组的元素总数。这相当于元素的乘积shape。
ndarray.dtype:描述数组中元素类型的对象。可以使用标准Python类型创建或指定dtype。此外,NumPy还提供自己的类型。numpy.int32,numpy.int16和numpy.float64就是一些例子。
ndarray.itemsize:数组中每个元素的大小(以字节为单位)。例如,类型的元素数组float64有itemsize8(= 64/8),而其中一个类型complex32有itemsize4(= 32/8)。它相当于ndarray.dtype.itemsize。
ndarray.data:包含数组实际元素的缓冲区。通常,我们不需要使用此属性,因为我们将使用索引工具访问数组中的元素。
例子:
二.数组的创建:
使用array函数从常规的python列表或者元组创建数组:
将序列转换成一个二维或者三维以上的数组:
也可以在创建时显式指定数组的类型:
创建数组例子
创建一个数组,通过shape函数得出这个数组是一维数组,6代表的是元素,但是是行向量还是列向量,这里没有明确标明,在实际中,一定要指定好向量,用reshape函数
先是定义一个列表a,通过array函数变成一维数组,再用reshape函数指定向量reshape((2,-1)),2表示横向量,-1是占位符(不一定要-1,任何数都可以),通过print shape(a),我们可以看出2是横向量,3是列向量,这时a已经变成了二维数组
我们可以试着把-1和2对换,reshape(-1,2),那么-1就变成了3,2代表是占位符,print
Shape(a)结果出来的是(3,2),3代表了横向量,2代表了列向量
如何去修改数组里面的元素呢?以上图为例,我想改5变成55,那么找到他的位置,在数组中,下标是从0开始的,那么5的位置是(横,列)(2,0)
修改成55:
在Numpy里面还提供了其他的创建数组的函数:
Zeros
通过zeros创建了(3,3)元素为0的二维数组
ones
通过ones函数去创建一个(2,3)元素为1的二维数组
Zeros和ones的功能都能通过full函数来实现,比如:
通过调用full函数创建一个(3,3),元素为0的二维数组,所以full的第一个参数是一个元组,元组里面定义了维度,第二个参数定义了元素值,如果第二个参数设置成0,那么和zeros是一样的,设置成1,是和ones一样的。
eye
创建一个单位矩阵
从左上角到右下角的这条对角线上的元素是1,其余为0
Random.random
创建随机数
- 数组的索引
Indexing
S=a[-2:, 1:3],-2代表倒数第二行,“:”后面不带数字说明一直到最后,取到的值是[5, 6, 7, 8,9, 10, 11, 12], 1:3代表是从第一列到第三列,“1,5,9”是编号为0的列,那么“2,6,10”为编号为1的列,3准确的来说是从第一列往后的两个元素,所以就是上图的结果
错误写法:
a[-2: 0][1: 3],在别的编程语言可以,在python不行
取出7的值:
-2代表着从后面往前数,第一位是-1
请看下面个测试:
从上面的测试可以看出,使用整数来进行索引时,它的纬度就会-1
第二个测试:
总结:最后一个数组是它上一个数组的纬度是要高一个纬度的,因为它并没有用整数作为索引,这就是对数组进行一个索引操作后,你的数组纬度可能会比原来的纬度低,也可能相同
Arange
第一个 产生0-2的数字,第二个固定一个数字范围,3-6,不包含最后一位
Np.arange的第一个参数是产生一个0-2的三个数字,第二个参数是列,+=10是里面的数+10,的出来的结果就如上图
这三种写法效果都是一样的
输出a>10的数字
- 数据的类型
dtype函数
如果数组里面全是整数,得出的数组数据类型是int32
如果数组里面全是小数,得出来的就是float64
如果又有整数又有小数,的出来的也是float64
如果我们将指定数据类型,将float64位的小数指定为int64,那么得出的结果是把小数部分给去掉,保留整数部分
- 数学运算与常用函数
两个数组之间相加,从得出的结果不难看出是两个数组之间对应的位置作和
Python当中,运算符的函数是add:+ ;subtract:- ; multiply:* ; divide:/
开方操作:sqrt(变量)
- 广播
这种用循环方式效率是非常慢的,可以用tile的函数
还有个广播方式:
不同纬度的数组相加,Numpy会将数组自动转换为相同的纬度,广播会在缺失纬度和纬度为一的上面运行