》》点赞,收藏+关注,理财&技术不迷路《《
目录:
1.0 numpy基础——ndarray对象
ndarray(The N-dimensional array)对象是用于存放同类型元素的多维数组,是numpy中的基本对象之一,另一个是func对象。
1 、简单介绍ndarray对象;
2、ndarray对象的常用属性;
3、如何创建ndarray对象;
4、ndarray元素访问。
它的维度以及个维度上的元素个数由shape决定。
1.0.1 numpy.ndarray()
ndarray函数就是numpy的构造函数,我们可以使用这个函数创建一个ndarray对象。构造函数有如下几个可选参数:
1.0.2 ndarray对象的常用属性
ndarray对象最常用的属性:
1.0.3 创建ndarray
array():
使用array函数,从常规的python列表或者元组中创建数组,元素的类型由原序列中的元素类型确定。
zeros(),ones(),empty():
函数ones创建一个全1的数组、函数zeros创建一个全0的数组、函数empty创建一个内容随机的数组,在默认情况下,用这些函数创建的数组的类型都是float64,若需要指定数据类型,只需要闲置dtype参数即可:
zeros/ones/empty_like():
上述三个函数还有三个从已知的数组中,创建shape相同的多维数组:ones_like、zeros_like、empty_like,用法如下:
还有如下几个特殊的函数:
eye函数的全1的对角线位置有参数k确定
arange(), linspace(), logspace():
arange函数类似python中的range函数,通过指定初始值、终值以及步长(默认步长为1)来创建数组
linspace函数通过指定初始值、终值以及元素个数来创建一维数组
logspace函数与linspace类似,只不过它创建的是一个等比数列,同样的也是一个一维数组
fromstring() & fromfunction():
fromstring函数从字符串中读取数据并创建数组
fromfunction函数由第一个参数作为计算每个数组元素的函数(函数对象或者lambda表达式均可),第二个参数为数组的形状
除了上面两个函数还有其他几个类似的从外部获取数据并创建ndarray,比如:frombuffer、fromfile、fromiter,还没用过,等用到了在详细记录
1.0.4 ndarray创建特殊二维数组
ndarray提供了一些创建二维数组的特殊函数。numpy中matrix是对二维数组ndarray进行了封装之后的子类。这里介绍的关于二维数组的创建,返回的依旧是一个ndarray对象,而不是matrix子类。关于matrix的创建和操作,待后续笔记详细描述。为了表述方便,下面依旧使用矩阵这一次来表示创建的二维数组。
diag函数返回一个矩阵的对角线元素、或者创建一个对角阵,对角线由参数k控制
diagflat函数以输入作为对角线元素,创建一个矩阵,对角线由参数k控制
tri函数生成一个矩阵,在某对角线以下元素全为1,其余全为0,对角线由参数k控制
tril函数输入一个矩阵,返回该矩阵的下三角矩阵,下三角的边界对角线由参数k控制
triu函数与tril类似,返回的是矩阵的上三角矩阵
vander函数输入一个一维数组,返回一个范德蒙德矩阵
1.0.5 array元素访问
一维数组:
对于一维的ndarray可以使用python访问内置list的方式进行访问:整数索引、切片、迭代等方式
关于ndarray切片
与内置list切片类似,形式:
array[beg:end:step]
beg: 开始索引
end: 结束索引(不包含这个元素)
step: 间隔
需要注意的是:
beg可以为空,表示从索引0开始;
end也可以为空,表示达到索引结束(包含最后一个元素);
step为空,表示间隔为1;
负值索引:倒数第一个元素的索引为-1,向前以此减1
负值step:从后往前获取元素
特别注意的是,ndarray中的切片返回的数组中的元素是原数组元素的索引,对返回数组元素进行修改会影响原数组的值
除了上述与list相似的访问元素的方式,ndarray有一种通过列表来指定要从ndarray中获取元素的索引,例如:
多维数组:
多维ndarray中,每一维都叫一个轴axis。在ndarray中轴axis是非常重要的,有很多对于ndarray对象的运算都是基于axis进行,比如sum、mean等都会有一个axis参数(针对对这个轴axis进行某些运算操作),后续将会详细介绍。
对于多维数组,因为每一个轴都有一个索引,所以这些索引由逗号进行分割,例如:
需要注意的是:
当提供的索引比轴数少时,缺失的索引表示整个切片(只能缺失后边的轴)
当提供的索引为:时,也表示整个切片
可以使用...代替几个连续的:索引
多维数组的迭代
可以使用ndarray的flat属性迭代数组中每一个元素
1.1 numpy概念, 属性和运算
1.1.1 概念和属性
NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。NumPy 是一个运行速度非常快的数学库,主要用于数组计算。它可以让你在 Python 中使用向量和数学矩阵,以及许多用 C 语言实现的底层函数。
NumPy 的核心是数组(arrays),具体来说是多维数组(ndarrays)。
数组的定义:
数组也有一些基本性质(维度,形状,元素数)
np.array()
array.ndim
array.shape
array.size
1.1.2 数组的创建:
数组类型定义:
dtype = np.int/float 定义数组类型
a = np.array([[1,2,3],[2,3,4]]) 定义一个多维数组
a = np.zeros((x, y),dtype = np.int16) 定义一个x行,y列的零矩阵(全为零)
a = np.ones((x, y),dtype = np.int16) 定义一个x行,y列的单位矩阵(全为1)
上面两个要是不写dtype的话,默认都是float。
a = np.arange(x, y, a) 定义一个从x到y的数组,步长为a。类似于python中的range。
a = np.arange(x, y, a).reshape((c,b)) 定义一个从x到y的数组,步长为a。类似于python中的range。然后数组形状c 行 b列。(这里面会存在长度不对等的问题!下面有例子)
a = np.linspace(x, y, a) 定义一个从x到y的数组,线,分割为a段(a个数)。
a = np.linspace(x, y, a).reshape((c, b)) 定义一个从x到y的数组,线,分割为a段(a个数)。以c行b列数组输出。
如果不特别指明的话,int,float就是指的64位。(根据个人电脑而定。)当然你也可指定int64, float64。
1.1.3 矩阵的运算和操作
以下是 加,减,乘,次方,除法,取余(模运算),整除。。。:
(可以拿我们最简单的那套,/,//,%等等,也可以调用内置函数比如:np.divide = /, np.reminder = np.mod() = % 等等)
加减乘除都是数组中每个元素意义对应运算的。
一维数组:
二维数组(矩阵):
矩阵的加减都很简单,这里重点将乘法!!因为 a * b 不等于np.dot(a,b)
a * b 是矩阵中对应位置相乘。np.dot(a, b)才是矩阵乘法。
另外:!!! np.dot(a, b) = a.dot(b) 两种表达方式!!!
随机生成数(都是生成0-1中的数字):
np.random.random()
求和,最大值,最小值:
np.sum() np.sum(X, axis = n) 每n行的和
np.max() np.max(X, axis = n) n行的最大值
np.min()
(axis = 0:代表没有行,就是列,max(axis=0)就是每一列的最大值,axis = 1就是每一行的最大值)
….
注意要是总共只有两行,不能让axis = 2。可能想得是axis = 2就等于max()了,但是axis=2会越界报错!!
索引最大值最小值位置,平均值,中位数,前N位和:(都可以具体到每一行每一列!!)
索引返回的是位置:
查找非零数:
转置矩阵和矩阵的乘法:
clip用法:
1.1.4 List(python), array(numpy)与matrix(numpy)
Python列表和Numpy数组的区别:
Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
使用Python列表可以存储一维数组,通过列表的嵌套可以实现多维数组,那么为什么还需要使用Numpy呢?
Numpy是专门针对 数组的操作和运算 进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。
通常Numpy数组中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以在通用性能方面Numpy数组不及Python列表,但在科学计算中,可以省掉很多循环语句,代码使用方面比Python列表简单的多。
Numpy数组和矩阵的区别:
1. Numpy matrices必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND). Matrix是Array的一个小的分支,包含于Array。所以matrix 拥有array的所有特性。
2. 在numpy中matrix的主要优势是:相对简单的乘法运算符号。例如,a和b是两个matrices,那么a*b,就是矩阵积。
3. matrix 和 array 都可以通过objects后面加.T 得到其转置。但是 matrix objects 还可以在后面加 .H f得到共轭矩阵, 加 .I 得到逆矩阵。
1.2 numpy的索引
数组中元素的索引,切片索引:
A[]
A[][] = A[X,Y]
: 冒号代表着输出全部
A[: , y] 输出 y 列的全部行,或者说输出每行的y列
A[x, a:b] 输出第x行的,第a到b列元素
输出每一行 for in: 输出每一列也是for in 但是要用转置矩阵!!
flatten() 函数和flat的使用:
A.flatten() 是将多维数组平铺,也就是说不管几维,都以一维数组形式输出。
flat:平面。 flatten:展开,平铺
1.3 array的合并
横向合并:hstack()
纵向合并:vstack()
(2,)是因为shape返回tuple类型,单个元素情况下必须写逗号,tuple类型的单个元素(3)自动变int。
行变列,列变行。再合并
(x,y)newaxis的替换。比如[2, 2] 要变成列向量,1. reshape()。2. 改为[2, 2][: , newaxis]。
也可以使用指定合并:
concatenate(?, axis = ?),axis=0就是转为列,axis=1就是变为行。
一个统一的问题:维度不一样的数组不能拼接!!
1.4 array的分割
等份分割:
hsplit(X,n) 注意n,越界或者不整除会报错
vsplit(X,n) 比如(3,4),要是按列分割,n=3就会错,因为4只可以分割1,2,4.如果是3的话就会导致出错
split(X,n,axis=?)
不等份分割:
array_split(X,n,axis=?) n可以随意,要是超出了范围就会后面加空数组来补,空数组的shape还是和前面一样。
1.5 copy&deep copy
!!!数组中只接受同类型!!!
python中变量就是地址. python中的默认赋值或者传值都是引用。
浅拷贝,就是指针指向同一片内存地址,同一个对象
a is b is c is d.(is就是比较对象的地址!!”==“是比较对象的值)
b,c,d 其实都是等于a的。a任何变化都会同时引起bcd变化。
四个指向同一个地址,这个地址中放着一个数据。
bcd的变换,同时也会影响a的变化!!!
如果想改变值又不想关联起来。就要用到deep copy。—— X.copy()
(只想关联值,但是不想关联关系)