1 数据结构
numpy使用一种称为ndarray的类似Matlab的矩阵式数据结构管理数据,比python的列表和标准库的array类更为强大,处理数据更为方便。
1.1 数组的生成
在numpy中,生成数组需要指定数据类型,默认是int32,即整数,可以通过dtype参数来指定,一般用到的有int32
、bool
、float32
、uint32
、complex
,分别代表整数、布尔值、浮点型、无符号整数和复数
一般而言,生成数组的方法有这么几种:
以list列表为参数生成(用tolist方法即可转换回list):
In[3]: a = array([1, 2, 3])
In[4]: a
Out[4]: array([1, 2, 3])
In[5]: a.tolist()
Out[5]: [1, 2, 3]
指定起点、终点和步长生成等差序列或等比数列:
In[7]: a = arange(1, 10, 2)
In[8]: a
Out[8]: array([1, 3, 5, 7, 9])
In[13]: a = linspace(0, 10, 5)
In[14]: a
Out[14]: array([ 0. , 2.5, 5. , 7.5, 10. ])
In[148]: a = logspace(0, 3, 10) # 0表示起点为10^0,3表示起点为10^3,基数通过base参数指定
In[149]: a
Out[148]:
array([ 1. , 2.15443469, 4.64158883, 10. ,
21.5443469 , 46.41588834, 100. , 215.443469 ,
464.15888336, 1000. ])
从迭代器中生成:
In[17]: iter = (i for i in range(5))
In[18]: a = fromiter(iter, dtype=int32)
In[19]: a
Out[19]: array([0, 1, 2, 3, 4])
从函数中生成:
In[156]: def f(i, j):
... return abs(i-j)
...
In[157]: fromfunction(f, (4, 4))
Out[156]:
array([[ 0., 1., 2., 3.],
[ 1., 0., 1., 2.],
[ 2., 1., 0., 1.],
[ 3., 2., 1., 0.]])
还可以用zeros、ones、empty等函数快速创建数组。
矩阵视为二维数组:
In[24]: b = array([arange(5), arange(1, 6), arange(2, 7)])
In[25]: b
Out[25]:
array([[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6]])
根据相同的方法可以拓展到更高维。
另外,我们还可以生成自定义数据格式的数组(称为结构数组),用来记录电子表格或数据库中一行数据的信息:
In[61]: t = dtype([('name', str, 40), ('number', int32), ('score', float32)])
In[62]: t
Out[62]: dtype([('name', '<U40'), ('number', '<i4'), ('score', '<f4')])
In[63]: students = array([('Tom', 10, 80), ('Jenny', 11, 90.5), ('Mike', 9, 98.5)], dtype=t)
In[64]: students
Out[64]:
array([('Tom', 10, 80.0), ('Jenny', 11, 90.5), ('Mike', 9, 98.5)],
dtype=[('name', '<U40'), ('number', '<i4'), ('score', '<f4')])
In[65]: students[1]
Out[65]: ('Jenny', 11, 90.5)
后面我们会看到pandas提供了一种更精致的方法处理记录。
1.2 数组的索引
简单的下标索引:
In[30]: a[2]
Out[30]: 2
In[31]: b[2, 1]
Out[31]: 3
与python一样,索引的起点为0。负数的索引当然也是可以的:
In[32]: a[-1]
Out[32]: 4
In[33]: b[-1, -2]
Out[33]: 5
以整数数组为下标索引,一次性索引多个值:
In[162]: arange(11, 20)[array([2, 4, 8])]
Out[161]: array([13, 15, 19])
还可以通过布尔值来索引:
In[40]: idx = array([True, False, False, True, True])
In[41]: a[idx]
Out[41]: array([0, 3, 4])
这可以应用在高级索引中,比如条件索引:
b[b>3]
Out[42]: array([4, 4, 5, 4, 5, 6])
得到b中所有大于3的元素,以array形式返回,我们能这么写的原因是b>3