NumPy:高性能科学计算&数据分析的基础包

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中常见的数据类型:

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,一些随机数的函数

NumPy:高性能科学计算&数据分析的基础包

 


# 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))

上一篇:接上


下一篇:CentOS 8.4离线安装Docker