一.numpy介绍
1.概述
NumPy是一个Python语言的软件包,它非常适合于科学计算。在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础库。
1.介绍
NumPy是一个用于科技计算的基础软件包,它是Python语言实现的。它包含了:
强大的N维数组结构
精密复杂的函数
可集成到C/C++和Fortran代码的工具
线性代数,傅里叶变换以及随机数能力
除了科学计算的用途以外,NumPy也可被用作高效的通用数据的多维容器。由于它适用于任意类型的数据,这使得NumPy可以无缝和高效的集成到多种类型的数据库中。
3.安装
pip3 install numpy
二.numpy的基础属性与数组的创建
1.数组相关介绍
NumPy的基础是一个同构的多维数据,数组中的元素可以通过下标来索引。在NumPy中,维度称之为axis(复数是axes),维度的数量称之为rank。
例如:
#1.下面是一个具有rank 1的数组,axis的长度为3:
[1,2,3]#2.下面是一个具有rank 2的数组,axis的长度也是3:
[[1,2,3],[3,4,5]]
2.创建数组
#1.创建数组
from numpy import *a=array([1,2,2])
b=array([(1,2,3.1),(4.2,5,6),[7,8,8],[9,9,9]])#2.创建数组错误的方法
c=array(1,2,2)#错误的,一定要在括号内加上中括号在进行创建
NumPy的数组类是ndarray,它有一个别名是 numpy.array,但这与Python标准库的array.array并不一样。后者仅仅是一个一维数组。而ndarray具有以下的属性:
ndarray.ndim:数组的维数。在Python世界中,维数称之为rank
ndarray.shape:数组的维度。这是一系列数字,长度由数组的维度(ndim)决定。例如:长度为n的一维数组的shape是n。一个n行m列的矩阵的shape是n,m
ndarray.size:数组中所有元素的数量
ndarray.dtype:数组中元素的类型,例如numpy.int32, numpy.int16或者numpy.float64
ndarray.itemsize:数组中每个元素的大小,单位为字节
ndarray.data:存储数组元素的缓冲。通常我们只需要通过下标来访问元素,而不需要访问缓冲
示例代码如下:
from numpy import *a=array([1,2,2])
b=array([(1,2,3.1),(4.2,5,6),[7,8,8],[9,9,9]])print(a.ndim)#1
print(a.shape)#(3,)
print(a.dtype)#int32
print(a.size)#3
print(a.itemsize)#4
print(a.data)#
print(b.ndim)#2
print(b.shape)#(4, 3)
print(b.dtype)#float64
print(b.size)#12
print(b.itemsize)#8
print(b.data)#
#注意:我们在创建数组的时候,我们可以指定元素的类型
c=array([[1,2,3],[4,5,6]],dtype=float)print(c) #[[1. 2. 3.][4. 5. 6.]]
3.创建特定的array数组
在实际上的项目工程中,我们常常会需要一些特定的数据,NumPy中提供了这么一些辅助函数:
zeros:用来创建元素全部是0的数组
ones:用来创建元素全部是1的数组
empty:用来创建未初始化的数据,因此是内容是不确定的
arange:通过指定范围和步长来创建数组
linespace:通过指定范围和元素数量来创建数组
random:用来生成随机数
示例如下:
from numpy import *a=zeros((2,3))print(a)
b=ones((2,3))print(b)
c=empty((2,3))print(c)
d=arange(2,6,2)print(d)
e=linspace(6,10,2)print(e)
f=random.random((2,3))print(f)#输出结果如下:
"""[[0. 0. 0.]
[0. 0. 0.]]
[[1. 1. 1.]
[1. 1. 1.]]
[[1. 1. 1.]
[1. 1. 1.]]
[2 4]
[ 6. 10.]
[[0.82896183 0.55448166 0.97457398]
[0.64787248 0.60058101 0.13440148]]"""
4.对原有的数组进行shape与操作
除了生成数组之外,当我们已经持有某个数据之后,我们可能会需要根据已有数组来产生一些新的数据结构,这时候我们可以使用下面这些函数:
reshape:根据已有数组和指定的shape,生成一个新的数组
vstack:用来将多个数组在垂直(v代表vertical)方向拼接(数组的维度必须匹配)
hstack:用来将多个数组在水平(h代表horizontal)方向拼接(数组的维度必须匹配)
hsplit:用来将数组在水平方向拆分
vsplit:用来将数组在垂直方向拆分
1.vstack和hstack的用法
#vstack和hstack的用法
#1.vstack的用法
a=np.arange(15).reshape(3,5)'''array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])'''b=np.array([1,1,1,1,1])
f=np.vstack([a,b])'''f=array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[ 1, 1, 1, 1, 1]])'''
#2.hstack的用法
c=np.array([1,2,3,4])
e=np.hstack([f,c.reshape(4,-1)])'''e=array([[ 0, 1, 2, 3, 4, 1],
[ 5, 6, 7, 8, 9, 2],
[10, 11, 12, 13, 14, 3],
[ 1, 1, 1, 1, 1, 4]])'''
2.hsplit和vsplit的用法
#hsplit和vsplit的用法#1.vspllit的用法
upper,lower=np.vsplit(e,[2])'''upper=array([[0, 1, 2, 3, 4, 1],
[5, 6, 7, 8, 9, 2]])
lower=array([[10, 11, 12, 13, 14, 3],
[ 1, 1, 1, 1, 1, 4]])'''
#2.hsplit的用法
left,right=np.hsplit(e,[-1])'''left=array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[ 1, 1, 1, 1, 1]])
right=array([[1],
[2],
[3],
[4]])'''
#一些特殊的用法#把一列变成一行
right[:,0]
array([1, 2, 3, 4])
相关测试代码:
为了便于测试,我们先创建几个数据。这里我们创建了:
zero_line:一行包含3个0的数组
one_column:一列包含3个1的数组
a:一个2行3列的矩阵
b:[11, 20)区间的整数数组
测试代码示例:
from numpy import *zero_line= zeros((1,3))
one_column= ones((3,1))print(zero_line,'\n')print(one_column,'\n')
a= array([(1,2,3), (4,5,6)])
b= arange(11, 20)print(a,'\n')print(b,'\n')#上述结果如下:
"""[[0. 0. 0.]]
[[1.]
[1.]
[1.]]
[[1 2 3]
[4 5 6]]
[11 12 13 14 15 16 17 18 19]"""
#数组b原先是一个一维数组,现在我们通过reshape方法将其调整成为一个3行3列的矩阵:
b= b.reshape(3, 3)#print(b,'\n')
"""[[11 12 13]
[14 15 16]
[17 18 19]]"""
#接着,我们通过vstack函数,将三个数组在垂直方向拼接:
c =vstack((a, b, zero_line))print(c)"""[[ 1. 2. 3.]
[ 4. 5. 6.]
[11. 12. 13.]
[14. 15. 16.]
[17. 18. 19.]
[ 0. 0. 0.]]"""
#同样的,我们也可以通过hstack进行水平方向的拼接。为了可以拼接我们需要先将数组a调整一下结构:
a = a.reshape(3, 2)print(a,'\n')"""[[1 2]
[3 4]
[5 6]]"""d=hstack((a, b, one_column))print(d,'\n')"""[[ 1. 2. 11. 12. 13. 1.]
[ 3. 4. 14. 15. 16. 1.]
[ 5. 6. 17. 18. 19. 1.]]"""
#请注意,如果两个数组的结构是不兼容的,拼接将无法完成。例如下面这行代码,它将无法执行:#vstack((a,b))#ValueError: all the input array dimensions except for the concatenation axis must match exactly
#这是因为数组a具有两列,而数组b具有3列,所以它们无法拼接。
#数组的水平拆分
print(d,'\n')
e= hsplit(d, 3)print(e,'\n')print(e[1],'\n')#运行结果
'''[[ 1. 2. 11. 12. 13. 1.]
[ 3. 4. 14. 15. 16. 1.]
[ 5. 6. 17. 18. 19. 1.]]
[array([[1., 2.],
[3., 4.],
[5., 6.]]), array([[11., 12.],
[14., 15.],
[17., 18.]]), array([[13., 1.],
[16., 1.],
[19., 1.]])]
[[11. 12.]
[14. 15.]
[17. 18.]]'''
#另外,假设我们设置的拆分数量使得原先的数组无法平均拆分,则操作会失败:#hsplit(d, 4) # ValueError: array split does not result in an equal division
三.索引
1.普通一维数组的操作
ndarray 对象的内容可以通过索引或切片来访问和修改,就像 Python 的内置容
器对象一样。
如前所述, ndarray 对象中的元素遵循基于零的索引。 有三种可用的索引方法类
型: 字段访问,基本切片和高级索引。
基本切片是 Python 中基本切片概念到 n 维的扩展。 通过
将 start , stop 和 step 参数提供给内置的 slice 函数来构造一个 Python
slice 对象。 此 slice 对象被传递给数组来提取数组的一部分。
相关示例代码:
#1.示例一:slice的用法
importnumpy as np
a= np.arange(10)
s= slice(2,7,2)print(a[s])#[2 4 6]
#2.示例二:通过将由冒号分隔的切片参数( start:stop:step ) 直接提供给 ndarray 对象,也可以获得相同的结果。
importnumpy as np
a= np.arange(10)
b= a[2:7:2]print(b)#[2 4 6]
#3.示例三:对单个元素进行切片
importnumpy as np
a= np.arange(10)
b= a[5]print(b) #5
#4.示例四:对始于索引的元素进行切片
importnumpy as np
a= np.arange(10)print( a[2:])#[2 3 4 5 6 7 8 9]
#5.示例五:对索引之间的元素进行切片
importnumpy as np
a= np.arange(10)print (a[2:5])#[2 3 4]
#6.示例六:对多维 ndarray进行操作
importnumpy as np
a= np.array([[1,2,3],[3,4,5],[4,5,6]])print(a,'\n')#对始于索引的元素进行切片
print (a[1:])'''[[1 2 3]
[3 4 5]
[4 5 6]]
[[3 4 5]
[4 5 6]]'''
#7.示例七:切片还可以包括省略号( ... ) ,来使选择元组的长度与数组的维度相同。 如果#在行位置使用省略号,它将返回包含行中元素的 ndarray#最开始的数组
importnumpy as np
a= np.array([[1,2,3],[3,4,5],[4,5,6]])print('我们的数组是:')print(a,'\n')#这会返回第二列元素的数组:
print ('第二列的元素是:')print(a[...,1],'\n')#现在我们从第二行切片所有元素:
print ('第二行的元素是:')print(a[1,...],'\n')#现在我们从第二列向后切片所有元素:
print ('第二列及其剩余元素是:')print (a[...,1:])'''我们的数组是:
[[1 2 3]
[3 4 5]
[4 5 6]]
第二列的元素是:
[2 4 5]
第二行的元素是:
[3 4 5]
第二列及其剩余元素是:
[[2 3]
[4 5]
[5 6]]'''
2.二维数组的操作
#普通操作
X=np.arange(15).reshape(3,5)#X=array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])#索引取值#1.取前两行和前三列
a=X[:2,:3]#a=array([[0, 1, 2],
[5, 6, 7]])#2.取特定的某个值
b=X[1,1] #取第二行的第二个元素#b=6
#注意:reshape的用法#reshape的把现有的数组改成相应的几行几列的数组#例如:X=np.arange(15).reshape(3,5)#上述就把一个一维数组改成了一个3行5列的数组了
###特别注意:改成的数组一定要符合行数和列数想乘起来要等于原数组的个数