Python数据分析之numpy数组全解析
1 什么是numpy
numpy是⼀个在Python中做科学计算的基础库,重在数值计算,也是⼤部分Python科学计算库的基础库,多⽤于⼤型、多维数据上执⾏数值计算。
在NumPy 中,最重要的对象是称为 ndarray 的N维数组类型,它是描述相同类型的元素集合,numpy所有功能⼏乎都以ndarray为核⼼展开。ndarray 中的每个元素都是数据类型对象(dtype)的对象。ndarray 中的每个元素在内存中使⽤相同⼤⼩的块
python获取数组长度2 numpy数组创建
创建Numpy数组⼀般有三种⽅法:
(1)通过传⼊可待跌对象创建,我将之称为基本⽅法
(2)使⽤Numpy内部功能函数,内部⽅法
(3)使⽤特殊的库函数,特殊⽅法
2.1 基本⽅法:np.array()
基本⽅法是通过给numpy提供的⼀些函数中传⼊可迭代对象来创建数组,这种⽅法通常是在已知所有元素的情况下使⽤。numpy中实现这种功能的函数包括:np.array()、np.arange()、np.line(),:
>>> np.array([0, 1, 2, 3, 4]) # 接收⼀个list作为参数
array([0, 1, 2, 3, 4])
>>> np.array([[11, 12, 13],[21, 22, 23]]) # 创建⼀个2*3的数组
array([[11, 12, 13],
[21, 22, 23]])
>>> np.array((0, 1, 2, 3, 4)) # 接收⼀个tuple作为参数
array([0, 1, 2, 3, 4])
np.array()⽅法可以在创建数组的同时指定数据类型:
>>> np.array([0, 1, 2, 3, 4], dtype=float)
array([0., 1., 2., 3., 4.])
甚⾄还可以接受range()返回的可迭代对象作为参数:
>>> np.array(range(5))
array([0, 1, 2, 3, 4])
>>> np.array(range(10, 20, 2))
array([10, 12, 14, 16, 18])
2.2 通⽤⽅法:np.ones()、np.zeros()、np.eye()
通⽤⽅法指的是numpy中提供的arange()、ones()、zeros()、eye()、full()等⽅法,这些⽅法可以按照某种规则⽣成⼀个数组,并不需要传⼊已知的可迭代对象。
(1)np.arange()
上⾯我们将range()函数结果传递给np.array(),np.arange()实现的就是这个功能,所以说,np.arange()就是numpy中的range()⽅法。
>>> np.arange(5)
array([0, 1, 2, 3, 4])
>>> np.arange(10, 20, 2)
array([10, 12, 14, 16, 18])
(2)np.linspace()
np.linspace()⽅法以等间距的形式对给定的两数进⾏划分来创建数组:
>>> np.linspace(10, 20, 5) # 将10到20间的数等距取5个
array([10. , 12.5, 15. , 17.5, 20. ])
(s()
创建⼀个元素值全为1的数组,接收⼀个list或者tuple作为参数
>>> np.ones([2]) # 创建⼀个⼀维数组
array([1., 1.])
>>> np.ones([2, 2]) # 创建⼀个2维数组
array([[1., 1.],
[1., 1.]])
>>> np.ones([2, 2, 2])
array([[[1., 1.],
[1., 1.]],
[[1., 1.],
[1., 1.]]])
(s()
创建⼀个元素值全为0的数组,接收⼀个list或者tuple作为参数
>>> np.zeros([3])
array([0., 0., 0.])
>>> np.zeros([3, 3])
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
(5)np.random.random()
创建⼀个元素为0到1之间随机数的数组,接收⼀个list或者tuple作为参数:
>>> np.random.random((3, 3))
array([[0.19414645, 0.2306415 , 0.08072019],
[0.68814308, 0.48019088, 0.61438206],
[0.5361477 , 0.33779769, 0.38549407]])
既然有random()⽅法,那么就会有randint()⽅法,也就是取随机整数的⽅法,不过这个randint()⽅法参数形式更random()不太⼀样,具体请看下⾯实例:
>>> np.random.randint(1, 10, 3) # 从1到10之间随机取3个整数创建数组
array([6, 4, 6])
(()
创建⼀个从左上⾓到右下⾓的对⾓线上全为1,其余元素全为0的数组(单位矩阵)。注意,np.eye()的参数可不再是list或者tuple了。
>>> np.eye(3, 3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
(7) np.full()
np.full()函数可以创建⼀个填充给定数值的数组,第⼀个参数是定义数组形状的list或tuple,第2个参数是需要填充的数值:
>>> np.full((2, 3), 3) # 创建⼀个2*3的数组,所有元素都填充3
array([[3, 3, 3],
[3, 3, 3]])
2.3 读取外部数据
numpy也⽀持从外部读取数据来创建数组,例如从硬盘中读取csv、txt等⽂件来创建数组。np.genfromtxt()是numpy中读取⽂件的⼀个⽅法,例如在当前⽬录下有⼀个data.csv⽂件,⽂件内容为:
id,height,length
1,100,101
2,200,230
3,300,350
通过numpy读取:
>>> np.genfromtxt('data.csv',delimiter=',',skip_header=1)
array([[ 1., 100., 101.],
[ 2., 200., 230.],
[ 3., 300., 350.]])
读取外部数据的⽅法不⽌np.genfromtxt(),还有np.load(等,但numpy读取外部数据的应⽤情况其实并不多,这⾥不再细说。
3 numpy中数组的数据类型
作为⼀个强⼤的科学计算库,numpy中⽀持的数据类型远不⽌Python原⽣的⼏种数据类型。如下所⽰为numpy中⽀持的数据类型:
数据类型描述
bool_布尔(True或False),存储为⼀个字节
int_默认整数类型(与Clong相同;通常是int64或int32)
INTC与Cint(通常为int32或int64)相同
INTP⽤于索引的整数(与Cssize_t相同;通常是int32或int64)
INT8字节(-128⾄127)
INT16整数(-32768⾄32767)
INT32整数(-2147483648⾄2147483647)
Int64的整数(-9223372036854775808⾄9223372036854775807)
UINT8⽆符号整数(0到255)
UINT16⽆符号整数(0到65535)
UINT32⽆符号整数(0到4294967295)
UINT64⽆符号整数(0到18446744073709551615)
float_float64的简写。
float16半精度浮点:符号位,5位指数,10位尾数
FLOAT32单精度浮点数:符号位,8位指数,23位尾数
float64双精度浮点:符号位,11位指数,52位尾数
complex_complex128的简写。
complex64复数,由两个32位浮点数(实部和虚部)
complex128复数,由两个64位浮点数(实部和虚部)
这些数据类型可以通过如np.bool_、np.float16等形式来调⽤,上⽂中提到过,创建数组时可以指定数据类型:
>>> a = np.array([0, 1, 0, 1], dtype=np.bool_)
>>> a
array([False, True, False, True])
可以通过numpy数组⾃带的dtype属性来查看数组的数据类型:
>>> a.dtype
dtype('bool')
为什么输出的类型是bool⽽不是bool_呢?因为numpy中后缀带下划线“_”的数据类型指向的就是Python原⽣的数据类型,也就是
说,np.bool_与Python中的bool数据类型等效,np.float_与Python中的float类型等效。
当⼀个数组已经被创建,但是想要改变其数据类型,那就可以通过np.asdtype()⽅法:
>>> a.astype(np.int)
array([0, 1, 0, 1])
>>> a = np.random.random((2,2))
>>> a
array([[0.02914317, 0.645534 ],
[0.61839509, 0.64155607]])
>>> a.dtype
dtype('float64')
>>> a.astype(np.float16)
array([[0.02914, 0.6455 ],
[0.618 , 0.6416 ]], dtype=float16)
>>> a.dtype
dtype('float64')
4 numpy中数组的形状
numpy中数组使⽤与存放多维数据,所以,所谓数组的形状指的就是数据的维度⼤⼩,以及每⼀维度元素个数。我们可以通过数组⾃带的shape属性来查看形状信息:
>>> a = np.array([[2, 3, 4], [5, 6, 7]])
>>> a
array([[2, 3, 4],
[5, 6, 7]])
>>> a.shape # 查看形状属性
(2, 3)
可以看到,查看形状属性时返回的是⼀个元组,元素的长度代表数组的维度,元组每⼀个属性代表对应的维度的元素个数,(2,3)就表⽰第⼀个维度元素个数是2(两⾏),第⼆个维度长度是3(3列)。
在数组创建之后,数组的形状也是可以改变的。改变数组的形状通过数组的reshape()⽅法:
>>> a = np.ones((2, 12))
>>> a
array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
>>> a.shape
(2, 12)
>>> b = a.reshape(2, 3, 4)
>>> b
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
>>> b.shape
(2, 3, 4)
>>> b = a.reshape((2,3,4)) # 元组作为参数
>>> b
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
>>> b.shape
(2, 3, 4)
可以看到,np.reshape()⽅法可以同时传⼊多个描述形状的数字,也可以传⼊⼀个数组,当然,如果将形状改变为⼀维数组时,必须传⼊的是元组。另外需要注意,传⼊reshape⽅法的多个参数的乘积必须与改变前数组总长度相等,否则会报错。
numpy数组中专门提供了⼀个⽅法加你个数组转换为以为数组,那就是flatten()⽅法,这个⽅法在执⾏数组运算是⾮常有⽤:
>>> a = np.ones((2, 3))
>>> b = a.flatten()
>>> b
array([1., 1., 1., 1., 1., 1.])
>>> b.shape
(6,)
5 索引与切⽚
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论