numpy不仅是 Python 中使用最多的第三方库,而且还是 SciPy、Pandas 等数据科学的基础库。它所提供的数据结构比 Python 自身的“更高级、更高效”,可以这么说,NumPy 所提供的数据结构是 Python 数据分析的基础。
在 NumPy 中需要重点掌握的就是对数组的使用即 NumPy和ufunc,因为这是NumPy和标准Python最大的区别,而ufunc能对数组中每个元素进行函数操作。NumPy 中很多 ufunc 函数计算速度非常快,因为都是采用 C 语言实现的。ta多用在大型多维数组上执行数值运算。
为什么要用 NumPy 数组结构而不是 Python 本身的列表 list?
-
list 的元素在系统内存中是分散存储的,而 NumPy 数组存储在一个均匀连续的内存块中。这样数组计算遍历所有的元素,不像列表 list 还需要对内存地址进行查找,从而节省了计算资源;
-
在内存访问模式中,缓存会直接把字节块从 RAM 加载到 CPU 寄存器中。因为数据连续的存储在内存中,NumPy 直接利用现代 CPU 的矢量化指令计算,加载寄存器中的多个连续浮点数;
-
NumPy 中的矩阵计算可以采用多线程的方式,充分利用多核 CPU 计算资源,大大提升了计算效率;
在 NumPy 里有如下两个极其重要的对象:
一,ndarray(N-dimensional array object)用来解决多维数组问题
1,创建数组
# encoding=utf-8
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array(range(1, 6))
c = np.arange(1, 6)
print a
print b
print c
print type(a)
print type(b)
print type(c)
print a.dtype
# 运行结果如下:
# [1 2 3 4 5]
# [1 2 3 4 5]
# [1 2 3 4 5]
# <type 'numpy.ndarray'>
# <type 'numpy.ndarray'>
# <type 'numpy.ndarray'>
# int64
#tips:注意一下 range和np.arange的区别
# 如右为返回值为:[1, 2, 3, 4, 5]
print range(1, 6)
# 如右为返回值为:<type 'list'>
print type(range(1, 6))
print('----------------')
# 如右为返回值为:[1 2 3 4 5]
print np.arange(1, 6)
# 如右为返回值为:<type 'numpy.ndarray'>
print type(np.arange(1, 6))
2,numpy中常见的数据类型:
3,数据类型的操作:
3.1,指定创建的数组的数据类型:
a=np.array([1,0,1,0],dtype=np.bool)
# 返回结果如右:[ True False True False]
print a
3.2,修改数组的数据类型:
a = np.array([1, 0, 1, 0], dtype=np.bool)
a=a.astype(np.float)
# 返回结果如右:[1. 0. 1. 0.]
print a
3.3,修改浮点类型的小数位数:
b = np.array([0.1214, 0.1767, 0.1999])
b = np.round(b, 2)
# 返回结果如右: [0.12 0.18 0.2]
print b
4,查看数组的形状
a=np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
# 运行结果如右:(2, 6)
print a.shape
5,修改数组的形状:
a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
a = a.reshape(3, 4)
# 运行结果如右:(3, 4)
print a.shape
6,把数组转为一维数据:
a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
a = a.reshape(1, 12)
# 运行结果如右:[3 4 5 6 7 8 4 5 6 7 8 9]
print a.flatten()
7,numpy索引和切片:
a = np.array([
[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11]])
# 取某一行,[4 5 6 7]
print a[1]
# 取某一列,[ 2 6 10]
print a[:, 2]
# 取多行,[[ 4 5 6 7]
# [ 8 9 10 11]]
print a[1:3]
# 取多列,[[ 2 3]
# [ 6 7]
# [10 11]]
print a[:, 2:4]
# 取某几行,所有列,[[ 4 5 6 7]
# [ 8 9 10 11]]
print a[[1, 2], :]
# 取所有行,某几列,[[ 2 3]
# [ 6 7]
# [10 11]]
print a[:, [2, 3]]
8,numpy中布尔索引:
t = np.arange(24).reshape((4, 6))
# 将t中值小于10的修改为0
t[t < 10] = 0
print t
# 运行结果如下:
# [[0 0 0 0 0 0]
# [0 0 0 0 10 11]
# [12 13 14 15 16 17]
# [18 19 20 21 22 23]]
9,numpy中三元运算符:
t = np.arange(24).reshape((4, 6))
# 将t中值小于10的修改为0,否则修改为10,numpy的三元运算符
t = np.where(t < 10, 0, 10)
print t
# 运行结果如下:
'''
[[ 0 0 0 0 0 0]
[ 0 0 0 0 10 10]
[10 10 10 10 10 10]
[10 10 10 10 10 10]]
'''
10,numpy中的clip(裁剪):
t = np.array([[0, 1, 2, 3, 4, 5],
[6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, np.nan, np.nan, np.nan]])
# 将t中值小于10的修改为10,大于或等于18的修改为18
t = np.clip(t, 10, 18)
print t
# 运行结果如下:
'''
[[10. 10. 10. 10. 10. 10.]
[10. 10. 10. 10. 10. 11.]
[12. 13. 14. 15. 16. 17.]
[18. 18. 18. nan nan nan]]
'''
11,np.nan 和np.inf
nan:not a number表示不是一个数字,当我们读取本地文件为float的时候,如果缺失,就会出现.或者当做了一个不合适的计算的时候(无穷大减去无穷大)也是如此;
inf表示正无穷大,-inf表示负无穷大;
a=np.inf
#1, 无穷大的类型为:<type 'float'>
print type(a)
#2, nan的类型为:<type 'float'>
b=np.nan
print type(b)
#3,两个nan是不相等的,False
print np.nan == np.nan
#4,利用以上特性,可以判断数组中nan的个数,1
t=np.array([1.,2.,np.nan])
print np.count_nonzero(t != t)
# 5,如果数据中含有nan,则把其替换为0,[1. 2. 0.]
t[np.isnan(t)]=0
print t
二,ufunc(universal function object)它是对数组进行处理的函数的统称
1,numpy中常用的统计函数
-
求和:t.sum(axis=None)
-
均值:t.mean(a,axis=None)
-
中位数:np.median(t,axis=None)
-
最大值:t.max(axis=None)
-
最小值:t.min(axis=None)
-
极值:np.ptp(t,axis=None)
-
标准差:t.std(axis=None)
2,常用的其他方法:
-
获取最大值最小值的位置:np.argmax(t,axis=0) ;np.argmin(t,axis=1)
-
创建一个全为0的数组:np.zeros((3,4))
-
创建一个全为1的数组:np.ones((3,4))
-
创建一个对角线为1的数组:np.eye(3))
3,一些随机数的函数
# np.random.rand() 该函数的参数是数组的维度,取值范围是[0,1]
# 0.761440624168
print np.random.rand()
# [0.91673038]
print np.random.rand(1)
# [[0.3286804 0.94399189]
# [0.99691882 0.51908634]]
print np.random.rand(2, 2)
np.random.randn()
np.random.randn(1)
np.random.randn(2, 2)
np.random.randint(1)
np.random.randint(1, 5)
np.random.randint(1, 12, size=(3, 4))
np.random.uniform(1,12,size=(3,4))
np.random.normal(0,1,size=(3,4))