1.开发环境:Anaconda3-5.2.0,点击这里下载所有版本
2.语言:python
3.如果对jupyter notebook的快捷键不知道如何使用,点击这里
首先要了解一点,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个部分。
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
是一个数据类型码,表示数据为整型。
更实用的则是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]])
内层的列表被当作二维数组的行。
面对大型数组的时候,用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.])
构建一个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)