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

技术
©2019-2020 Toolsou All rights reserved,
程序员的520,送给女友的几行漂亮的代码(python版)基于stm32控制四轮小车电机驱动(一)linux查看磁盘空间命令实验四 自动化测试工具-软件测试axios拦截器封装与使用C语言——qsort函数opencv-python傅里叶变换以及逆变换在算法研究过程中如何进行算法创新nc的安装和简单操作C语言做一个简易的登陆验证(功能)界面