1. 目的
熟悉numpy进行数据处理
2. 常用函数
2.1 numpy.choose
- 查看帮助
numpy.choose目的是,从现有数组中,根据给定的下标, 生成新的数据
def choose(a, choices, out=None, mode='raise')
a : 表示下标
choice : 函数根据a的下标从choice中选择数据
- 实例理解
import numpy as np
y = np.array([0,1,3,2,4,5,6,7])
# y = np.random.randint(0,10,10)
# 数组[1, 2, 3]为被选择数据
np.choose(y, [1, 2,3],mode='wrap')
# 输出:
In [33]: np.choose(y, [1, 2,3],mode='wrap')
Out[33]: array([1, 2, 1, 3, 2, 3, 1, 2])
In [35]: np.choose(y, [1, 2,3], mode='clip')
Out[35]: array([1, 2, 3, 3, 3, 3, 3, 3])
# 如果去掉mode参数,会报错, 因为y数组代表的下标,已经超过被选择的数组长度3
In [35]: np.choose(y, [1, 2,3])
ValueError: invalid entry in choice array
2.2 numpy.ndindex
- 查看帮助
输出数组的下标 - 实例理解
in [38]: y2 = np.array([0, 1, 3, 2, 4, 5, 6, 7])
Out[38]: array([0, 1, 3, 2, 4, 5, 6, 7])
In [39]: for i in np.ndindex(y.shape):print i
(0,)
(1,)
(2,)
(3,)
(4,)
(5,)
(6,)
(7,)
In [42]: y3 = np.random.randint(0,9,9).reshape(3,3)
In [43]: y3
Out[43]:
array([[2, 5, 6],
[2, 1, 7],
[2, 3, 6]])
In [44]: for i in np.ndindex(y3.shape):print i
(0, 0)
(0, 1)
(0, 2)
(1, 0)
(1, 1)
(1, 2)
(2, 0)
(2, 1)
(2, 2)
2.3 reshape
- 数据维度变化
- 实例
>>> arr = np.arange(0, 8, 1)
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> arr.reshape((2, 4))
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
# 同样:已知数组元素格式, 可以仅指定列维度数,行为度缺省为-1, 同样可以转化成功
>>> arr.reshape((-1, 4))
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
# 同样, 已知数组元素格式, 可以仅指定行维度数,列为度缺省为-1, 同样可以转化成功
>>> arr.reshape((2, -1))
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
# 备注: -1表示函数会根据另外一个维度值和元素数,自动计算并匹配该维度
2.4 numpy.squeeze
- 把numpy.narray中维度等于1的去掉
- 实例
# x.shape = (1, 3, 1)
# x.squeeze().shape() = (3,)
# 即: 去掉shape中的两个1, 具体实例如下:
>>> x = np.array([[[0], [1], [2]]])
>>> x
array([[[0],
[1],
[2]]])
>>> x.shape
(1, 3, 1)
# 下面执行squeeze函数
>>> x.squeeze()
array([0, 1, 2])
>>> x.squeeze().shape
(3,)
# 实例2
>>> x1 = [[1,2,3,4],[2,3,4,5]]
>>> x2 = numpy.array([x1])
>>> x2.shape
(1, 2, 4)
# 执行squeeze函数,观察shape变化
>>> x3 = x2.squeeze()
>>> x3.shape
(2, 4)
2.5 np.random.seed(0)
- 使得random函数产生的随机数不变
- 实例
# 注意: 必须每次调用np.random之前注册随机种子,以确保每次产生随机值相同
In [15]: np.random.seed(0); print np.random.rand(4);
[ 0.5488135 0.71518937 0.60276338 0.54488318]
In [16]: np.random.seed(0); print np.random.rand(4);
[ 0.5488135 0.71518937 0.60276338 0.54488318]
2.5 np.linspace
- 创建线性等差数组
- 实例
>>> np.linspace(0,10,5)
array([ 0. , 2.5, 5. , 7.5, 10. ])
# 绘图,更直观
>>> import matplotlib.pyplot as plt
>>> plt.plot(np.linspace(0,10,5))
>>> plt.show()
2.6 np.searchsorted(arr, data)
- 按照数组arr内元素顺序,将data划分类N类,N=len(arr)
- 实例
# 划分标准数组
>>> arr = np.arange(0, 5, 1)
array([0, 1, 2, 3, 4])
# arr = np.linspace(0, 10, 5)
# 被划分数组
>>> data = np.array([1.1, 3.5, 4.9, 5.1, 0])
>>> np.searchsorted(arr, data)
array([2, 4, 5, 5, 0])
# 2代表: 1-2区间; 4代表: 3-4区间
# 即: data 数据的值,被映射到数组arr创建的区间内
2.7 np.ravel(order='C')
- 将多维数组打平,变成一维数组
- order = 'C' 顺序从左到右,从上到下进行flatten
- order = 'F','A','K'自己修改看变化
- 实例
>>> arr = np.arange(0,27,1).reshape((3,3,3))
>>> arr
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
>>> arr.ravel()
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26])
2.8 array[::]用法
- 了解numpy.array的切片
- 实例
import numpy as np
arr = np.arange(0, 10, 1)
Out[48]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
def f(begin, step):
arr[begin::step]
# begin是数组起始的下标位置, 缺省默认为从0开始
# step为移动的步伐,如为正数,表示起始位置从左到右,负数则起始位置从右到左,缺省值为1
# 举例:
In [49]: arr[3::1]
Out[49]: array([3, 4, 5, 6, 7, 8, 9])
In [50]: arr[3::2]
Out[50]: array([3, 5, 7, 9])
In [51]: arr[3::-1]
Out[51]: array([3, 2, 1, 0])
In [52]: arr[3::-2]
Out[52]: array([3, 1])
2.9 np.c_ 与 np.r_
- 实例
In [57]: s1
Out[57]: array([1, 2, 3, 4])
In [58]: s2
Out[58]: array([1, 2, 3, 4])
In [62]: np.c_[s1, s2]
Out[62]:
array([[1, 1],
[2, 2],
[3, 3],
[4, 4]])
In [63]: np.r_[s1, s2]
Out[63]: array([1, 2, 3, 4, 1, 2, 3, 4])
In [64]: s3
Out[64]: [1, 2, 3, 4, 1, 2, 3, 4]
In [65]: np.r_[s1, s2, s3]
Out[65]: array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])
2.10 np.meshgrid
- 实例
>>> nx, ny = (3, 2)
>>> x = np.linspace(0, 1, nx)
>>> y = np.linspace(0, 1, ny)
>>> xv, yv = np.meshgrid(x, y)
>>> xv
array([[ 0. , 0.5, 1. ],
[ 0. , 0.5, 1. ]])
>>> yv
array([[ 0., 0., 0.],
[ 1., 1., 1.]])
>>> xv, yv = np.meshgrid(x, y, sparse=True) # make sparse output arrays
>>> xv
array([[ 0. , 0.5, 1. ]])
>>> yv
array([[ 0.],
[ 1.]])
2.11 hstack与vstack
- hstack即:两侧,每个子元素水平元素相加
- vstack即:两侧,每个子元素垂直元素相加
- 实例:
# 顺便说下newaxis功能, 即:将子元素增加一维度
# (2,) => (2,1) (2,3)=>(2,1,3)
from numpy import newaxis
In [44]: a1 = np.array([1,2])
In [45]: b1 = np.array([10,20])
In [46]: a1[:,newaxis]
Out[46]:
array([[1],
[2]])
In [48]: np.vstack((a1[:,newaxis], b1[:, newaxis]))
Out[48]:
array([[ 1],
[ 2],
[10],
[20]])
In [58]: np.hstack((a1[:,newaxis], b1[:, newaxis]))
Out[58]:
array([[ 1, 10],
[ 2, 20]])