NumPy
Numpy(Numerical Python) 是科学计算基础库,提供大量科学计算相关功能,比如数据统计,随机数生成等。其提供最核心类型为多维数组类型(ndarray),支持大量的维度数组与矩阵运算,Numpy支持向量处理ndarray对象,提高程序运算速度。
本期我们接着介绍numpy中的方法:
小tips
在介绍之前,说明一个jupyter notebook界面操作方法:
一个变量不需要print打印,可以直接输出结果
比如:
import numpy as np
b = np.array([1,2,3,4,5,6])
b #直接就可以输出
------------------------------
[1 2 3 4 5 6]
一维数组索引和切片
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python中 list 的切片操作一样。
ndarray 数组可以基于 0 - n 的下标进行索引,并设置 start, stop及 step 参数进行,从原数组中切割出一个新数组。
#一维数组索引和切片,下标位置从0开始
x = np.arange(10) #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[1]
结果:1
----------------
x[2:7:2] #表示x从2-7的范围内,隔两步取一个值
结果:array([2, 4, 6])
------------------------------
x[2:] #表示从第二个位置索引开始切片
结果:array([2, 3, 4, 5, 6, 7, 8, 9])
一维数组负索引和切片的使用
x = np.arange(10)
x[-2] #负索引位置从-1开始
------------
8
二维数组的索引和切片
#二维数组的索引和切片 先索引行再索引列,精准定位切片位置。
#行、列索引都从0开始
#reshape方法改数组的形状维度
x = np.arange(1,13)
a = x.reshape(3,4) #a=array([[ 1, 2, 3, 4],
#[ 5, 6, 7, 8],
#[ 9, 10, 11, 12]])
#索引直接获取
a[1] #索引行
结果:array([5, 6, 7, 8])
-------------------------
a[1][2] #切行索引为一,列索引为2的值
结果:7
=======================================
#使用坐标获取数组
a[:,1] #所有行的第二列
结果:array([ 2, 6, 10])
-------------------------------
a[2,1] #第三行第二列
结果:10
---------------------------------
a[::2,0] #在第一列,隔两步取一行
结果:array([1, 9])
----------------------------------
a[(0,2),(1,2)] #注意!!!前一个括号内的都是行坐标,第二个都是列坐标,两者一一对应
结果:array([ 2, 11])
二维数组负索引的使用
# 二维数组负索引的使用
x = np.arange(1,13)
a = x.reshape(3,4) #a=array([[ 1, 2, 3, 4],
#[ 5, 6, 7, 8],
#[ 9, 10, 11, 12]])
a[-1] #获取最后一行
结果:array([ 9, 10, 11, 12])
----------------------------
a[::-1] #行进行倒序
结果:array([[ 9, 10, 11, 12],
[ 5, 6, 7, 8],
[ 1, 2, 3, 4]])
-------------------------------
a[::-1,::-1] #行列都倒序
结果:array([[12, 11, 10, 9],
[ 8, 7, 6, 5],
[ 4, 3, 2, 1]])
------------------------------
a[::,::-1] #列倒序
结果:array([[ 4, 3, 2, 1]
[ 8, 7, 6, 5],
[12, 11, 10, 9]])
切片数组的复制
#切片数组的复制
#拷贝
sub_array=a[:2,:2]
sub_array[0][0]=1000 #将切片位置的值强行替换了
sub_array
------------------------
array([[1000, 2],
[ 5, 6]])
改变数组的维度
通过reshape方法可以将一维数组变成二维、三维或者多维数组,也可以通过reshape方法将多维数组变成一维。
#改变数组的维度
#升维
a=np.arange(24) #一维数组
结果:array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
----------------------------------
b=np.arange(24).reshape(4,6) #二维数组
结果:array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
-------------------------------------------
c=np.arange(24).reshape(2,2,6) #三维数组
c
结果:array([[[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]],
[[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]]])
============================
#降维
c.reshape(-1)
--------------------
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
ravel方法和flatten方法
通过ravel方法或flatten方法可以将多维数组变成一维数组。改变数组的维度还可以直接设置Numpy数组的shape属性(元组类型),通过resize方法也可以改变数组的维度。
#ravel方法
np.arange(24).reshape(2,2,6).ravel()
----------------------------------------
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
=============================================
#flattn方法
np.arange(24).reshape(2,2,6).flatten()
------------------------------------------
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
数组的拼接
函数 | 描述 |
---|---|
concatenate | 连接沿现有轴的数组序列 |
hstack | 水平堆叠序列中的数组(列方向) |
vstack | 竖直堆叠序列中的数组(行方向) |
concatenate()
concatenate 函数用于沿指定轴连接相同形状的两个或多个数组,格式如下:
numpy.concatenate((a1, a2, ...), axis)
a1, a2, …:相同类型的数组
axis:沿着它连接数组的轴,默认为 0
列表的拼接
直接拼接:
#直接拼接
a=[1,2,3]
b=[4,5,6]
a.extend(b)
a
-----------------
[1, 2, 3, 4, 5, 6]
一维数组的拼接:
#一维数组的拼接
x = np.arange(1,4)
y = np.arange(4,7)
np.concatenate((x,y))
-----------------------------
array([1, 2, 3, 4, 5, 6])
二维数组的拼接
#二维数组的拼接 axis=0时,上下拼接。axis=1时,左右拼接。axis默认为0.
#行方向的拼接
a=np.arange(24).reshape(4,6)
b=np.arange(18).reshape(3,6)
np.concatenate((a,b),axis=0)
---------------------------------
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])
#列方向的拼接
a=np.arange(24).reshape(4,6)
b=np.arange(28).reshape(4,7)
# np.hstack((a,b))
np.concatenate((a,b),axis = 1)
-------------------------------------
array([[ 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6],
[ 6, 7, 8, 9, 10, 11, 7, 8, 9, 10, 11, 12, 13],
[12, 13, 14, 15, 16, 17, 14, 15, 16, 17, 18, 19, 20],
[18, 19, 20, 21, 22, 23, 21, 22, 23, 24, 25, 26, 27]])
数组的转置
将行与列对调,即第一行变成第一列…或第一列变成第一行…的操作即是转置操作。
transpose进行转换
#数组的转置 将行与列对调
#transpose()进行转置
a=np.arange(1,13).reshape(2,6)
a
--------------------
array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12]])
二维转置
a.transpose()和a.T两种方法都可以转置
#二维转置
a.transpose()
------------------
array([[ 1, 7],
[ 2, 8],
[ 3, 9],
[ 4, 10],
[ 5, 11],
[ 6, 12]])
或者:
b=np.arange(2,14).reshape(2,6)
b.T
-----------------
array([[ 2, 8],
[ 3, 9],
[ 4, 10],
[ 5, 11],
[ 6, 12],
[ 7, 13]])
数组的分隔
split分隔
numpy.split 函数沿特定的轴将数组分割为子数组,格式如下:
numpy.split(ary, indices_or_sections, axis)
ary:被分割的数组
indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)
axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分
#数组分隔
#格式:split()分隔------>numpy.split(ary,indices_or_sections,axis)
x = np.arange(1,9)
x
结果:array([1, 2, 3, 4, 5, 6, 7, 8])
----------------------------------------
a = np.split(x,4)
a
结果:[array([1, 2]), array([3, 4]), array([5, 6]), array([7, 8])]
传递数组进行分隔
x = np.arange(1,9)
b = np.split(x,[2,4]) #以传递的数组中,在第2个索引位置和第4个索引位置的前面分隔
b
[array([1, 2]), array([3, 4]), array([5, 6, 7, 8])]
水平分隔
使用hsplit函数可以水平分隔数组,该函数有两个参数,第1个参数表示待分隔的数组,第2个参数表示要将数组水平分隔成几个小数组。
#水平分隔:左右分隔
a = np.arange(24).reshape(4,6)
np.hsplit(a,2) #分隔a数组,分成两份
--------------------
[array([[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14],
[18, 19, 20]]),
array([[ 3, 4, 5],
[ 9, 10, 11],
[15, 16, 17],
[21, 22, 23]])]
垂直分割
使用vsplit函数可以垂直分隔数组,该函数有两个参数,第1个参数表示待分隔的数组,第2个参数表示将数组垂直分隔成几个小数组。
#垂直分隔:上下分隔
np.vsplit(a,2)
-------------------------------------
[array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]]),
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])]
总结
本篇介绍了一部分Numpy库中的方法,Numpy库很大很丰富,务必整理牢记,对接下来的学习很重要。
加强整理,要动手敲哇。
还有部分方法下期介绍哦~(常用的就剩一点咯)。