python数据分析-NumPy (一)

前言:

1.开发环境:Anaconda3-5.2.0,点击这里下载所有版本

2.语言:python

3.如果对jupyter notebook的快捷键不知道如何使用,点击这里

1. NumPy入门

1.1 python中的数据类型

首先要了解一点,python是动态语言,Java/c是静态语言。这两者最明显的地方就在于java/c需要明确声明变量类型,而python中类型是动态推断的,也就是说在python中任何类型的数据可以指定给任何变量:

a = 5
a = "one"

标准的python实现是用C语言编写的,所以每个python对象都是一个伪c语言结构体。比如说上面的a=5,这里的a其实是一个指针,指向一个 c语言的复合结构体,查看python源代码:

struct _longobject {
  long ob_refcnt;
  PyTypeObject *ob_type;
  size_t ob_size;
  long ob_digit[1];
};

也就是说python3.X中的一个整型实际上包括4个部分。

  • ob_refcnt是一个引用计数,帮python处理内存的分配和回收。
  • ob_type将变量的类型编码
  • ob_size指定接下来的数据成员的大小
  • ob_digit 包含python变量表示的实际整型值

python可以创建一个整值型列表、字符串列表、或异构的列表:

L1 = [0,1,2,3,4,5]
L2 = ['0','1','2','3','4','5']
L3 = [True,"1",2.0,3]

python这种灵活性相较静态语言来说很高,但是为了获得这些类型,列表中的每一项必须包含各自的类型信息、引用计数和其他信息,也就是说每一项都是一个完整的python对象。

如果一个列表中只存储同一种类型数据,那么很多信息都是多余的,因此可以使用固定类型的NumPy式数组可以更有效的存储和操作数据。

python3.3之后可以使用内置的数组模块创建统一类型的密集数组:

>>> import array
>>> L = list(range(10))
>>> A = array.array('i',L)
>>> A
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

这里的i是一个数据类型码,表示数据为整型。

1.2 从Python列表创建数组

更实用的则是NumPy包中的ndarray对象,python的数组对象提供了数组型数据的有效存储,而NumPy为该数据加上了高效的操作。

NumPy包标准别名是np,这里使用np.array从python列表创建数组:

In [1]: import numpy as np
#整型数组
In [2]: np.array([1,2,3,4,5])
Out[2]: array([1, 2, 3, 4, 5])

NumPy要求数组必须是同一类型的数据,如果类型不匹配,NumPy将会向上转换(如果可行),这里整型被转换为浮点型:

In [3]: np.array([1.2,3,4,5])
Out[3]: array([1.2, 3. , 4. , 5. ])

如果希望明确设置数组的数据类型,可以用dtype关键字:

In [4]: np.array([1,2,3,4,5],dtype='float32')
Out[4]: array([1., 2., 3., 4., 5.], dtype=float32)

不同于python列表,numpy数组可以被指定为多维的,以下是用列表的列表初始化多维数组的一种方法:

#嵌套列表构成的多维数组
In [5]: np.array([range(i,i+3) for i in [2,4,6]])
Out[5]: 
array([[2, 3, 4],
       [4, 5, 6],
       [6, 7, 8]])

内层的列表被当作二维数组的行。

1.3 从头创建数组

面对大型数组的时候,用Numpy内置的方法从头创建数组是一种更高效的方法:

#创建一个长度为10的数组,数组的值都是0
In [7]: np.zeros(10,dtype=int)
Out[7]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
  
  
#创建一个3x5的浮点型数组,数组的值都是1
In [8]: np.ones((3,5),dtype=float)
Out[8]: 
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])

#创建一个3x5的浮点型数组,数组的值都是3.14
In [9]: np.full((3,5),3.14)
Out[9]: 
array([[3.14, 3.14, 3.14, 3.14, 3.14],
       [3.14, 3.14, 3.14, 3.14, 3.14],
       [3.14, 3.14, 3.14, 3.14, 3.14]])

#创建一个3x5的浮点型数组,数组的值是一个线性序列
#从0开始,到20结束,步长为2
In [10]: np.arange(0,20,2)
Out[10]: array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])

#创建一个5个元素的数组,这5个数均匀地分配到0~1
In [11]: np.linspace(0,1,5)
Out[11]: array([0.  , 0.25, 0.5 , 0.75, 1.  ])

#创建一个3x5的、在0~1均匀分布的随机数组成的数组
In [12]: np.random.random((3,5))
Out[12]: 
array([[0.482636  , 0.62152376, 0.30229131, 0.35277792, 0.0722043 ],
       [0.94348446, 0.65557036, 0.13796155, 0.76218402, 0.67373596],
       [0.6933232 , 0.01037482, 0.9854809 , 0.34008895, 0.68024072]])

#创建一个3x5的、[0,10)区间的随机整型数组
In [13]: np.random.randint(0,10,(3,5))
Out[13]: 
array([[7, 1, 3, 1, 9],
       [1, 8, 8, 3, 6],
       [7, 6, 3, 8, 4]])

#创建一个3x3的单位矩阵
In [14]: np.eye(3)
Out[14]: 
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

#创建一个由3个整型数组成的未初始化的数组
#数组的值是内存空间的任意值
In [15]: np.empty(3)
Out[15]: array([1., 1., 1.])

1.4 NumPy标准数据类型

构建一个NumPy数组时,你可以用一个字符串参数来指定数据类型:

#方式一
In [16]: np.zeros(10,dtype='int16')
Out[16]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int16)
#方式二
In [17]: np.zeros(10,dtype=np.int16)
Out[17]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int16)

你可能感兴趣的:(python数据分析)