1 List、Array、NumPy数值处理方法比较
1.1 List的三个缺点
- 列表可以是任何对象
- 列表中所保存的是对象和对象的指针,这种数据结构浪费内存和CPU计算时间
1.2 array模块
- 直接保存数值
- 不支持多维
- 没有各种运算函数,不适合做数值运算
1.3 NumPy优点:ndarray和ufunc
- ndarray是存储单一数据类型的多维数组
- ufunc则是能够对数组进行处理的函数
2 创建N维数组
2.1 通过序列创建N维数组
import numpy as np
In [1]:a = np.array([1,2,3,4])
In [2]:a
Out[2]: array([1, 2, 3, 4])
In [4]:b = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
In [5]:b
Out[5]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
2.2 指定查看数据的类型:dtype
In [6]:b.dtype
Out[7]: dtype('int32')
#指定为浮点型
In [8]:b1 = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]],dtype=float)
In [9]:b1
Out[9]:
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]])
#指定为复数型
In [10]:b2 = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]],dtype=complex)
In [11]:b2
Out[11]:
array([[ 1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j],
[ 5.+0.j, 6.+0.j, 7.+0.j, 8.+0.j],
[ 9.+0.j, 10.+0.j, 11.+0.j, 12.+0.j]])
2.3 查看更改指定数组的维度:shape
In [12]:a.shape
Out[12]: (4,)
In [13]:b.shape
Out[13]: (3, 4)
In [14]:a.shape=(2,2)
In [14]:a
Out[15]:
array([[1, 2],
[3, 4]])
In [16]:d = b.reshape((4,3))
In [16]:d
Out[17]:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
3 Numpy中常用的专门用来生成数组的函数
- arange函数类似于python的range函数,通过指定开始值、终值和步长来创建一维数组
In [18]:np.arange(0,1,0.1)
Out[18]: array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
- linspace函数通过指定开始值、终值和元素个数来创建一维数组
In [19]:np.linspace(0,1,5)
Out[19]: array([ 0. , 0.25, 0.5 , 0.75, 1. ])
- logspace函数和linspace类似,函数通过指定开始值、终值和元素个数,创建等比数列创建一维数组
In [20]:np.logspace(0,1,10)
Out[20]: array([ 1. , 1.29154967, 1.66810054, 2.15443469,
2.7825594 , 3.59381366, 4.64158883, 5.9948425 ,
7.74263683, 10. ])
4 数据的存取(切片提取子集)
In [21]:a = np.arange(10)
In [21]:a
Out[22]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 用整数作为下标可以获取数组中的某个元素
In [23]:a[8]
Out[23]: 8
# 用范围作为下标获取数组的一个切片,包括a[3]不包括a[5]
In [24]:a[2:6]
Out[24]: array([2, 3, 4, 5])
# 省略开始下标,表示从a[0]开始
In [25]:a[:7]
Out[25]: array([0, 1, 2, 3, 4, 5, 6])
# 下标可以使用负数,表示从数组后往前数
In [26]:a[:-1]
Out[26]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])
# 下标用来修改元素的值
In [27]:a[2:4] = 100,101
In [27]: a
Out[28]: array([ 0, 1, 100, 101, 4, 5, 6, 7, 8, 9])
# 范围中的第三个参数表示步长,2表示隔一个元素取一个元素
In [29]:a[1:-1:2]
Out[29]: array([ 1, 101, 5, 7])
# 省略范围的开始下标和结束下标,步长为-1,整个数组头尾颠倒
In [30]:a[::-1]
Out[30]: array([ 0, 1, 100, 101, 4, 5, 6, 7, 8, 9])
# 步长为负数时,开始下标必须大于结束下标
In [31]:a[5:1:-2]
Out[31]: array([ 5, 101])
- 和Python的列表序列不同,通过下标范围获取的新的数组是原始数组的一个视图。它与原始数组共享同一块数据空间
# 通过下标范围产生一个新的数组b,b和a共享同一块数据空间
In [32]:b = a[3:7]
Out[32]: array([101, 4, 5, 6])
# 将b的第2个元素修改为-10
In [33]:b[2] = -10
Out[33]: array([101, 4, -10, 6])
# a的第5个元素也被修改为10
In [34]:a
Out[34]: array([ 0, 1, 100, 101, 4, -10, 6, 7, 8, 9])
- 使用序列(可以是列表或者数组提取子集)。使用整数序列作为下标获得的数组不和原始数组共享数据空间
# 获取a中的下标为1, 1, 3, 8的4个元素,组成一个新的数组
In [35]:a[[1,1,3,8]]
Out[35]: array([ 1, 1, 101, 8])
#下标可以是负数
In [36]:b = a[np.array([1,1,-1,8])]
Out[36]: array([1, 1, 9, 8])
# 使用布尔数组
In [37]:a[np.array([True, False, True, True])]
Out[37]: array([ 0, 100, 101])
5 多维数组
In [38]:c = np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6)
Out[38]:c
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
In [39]:c[0,3:5]
Out[39]: array([3, 4])
In [40]:c[4:,4:]
Out[40]:
array([[44, 45],
[54, 55]])
In [41]:c[:,2]
Out[41]:
array([ 2, 12, 22, 32, 42, 52])
In [42]:c[2::2,::2]
Out[42]:
array([[20, 22, 24],
[40, 42, 44]])
# 使用序列和布尔提取
In [43]:c[(0,1,2,3,4),(1,2,3,4,5)]
Out[43]: array([ 1, 12, 23, 34, 45])
In [44]:c[3:,(0,2,5)]
Out[44]:
array([[30, 32, 35],
[40, 42, 45],
[50, 52, 55]])
In [45]:mask = np.array([1,0,1,0,0,1],dtype=np.bool)
Out[45]: array([ True, False, True, False, False, True], dtype=bool)
In [46]:c[mask,2]
Out[46]: array([ 2, 22, 52])