1.1 总体说明

NumPy(Numeric Python)是Python的开源数值计算扩展,它可以用来存储和管理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多。NumPy常常被评价为将Python变成免费且强大的Matlab。

NumPy包括了强大的N维数组,比较成熟的函数库,用于整合C/C++和Fortran代码的工具包,以及实用的线性代数、傅里叶变换和随机数生成函数。NumPy和稀疏矩阵运算包Scipy配合使用更加方便。它提供了许多方便的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。

1.2 代表性函数使用介绍

1.numpy数组与python列表效率对比(使用ipython环境)

import numpy as np

arr = np.arange(1e7)
larr = arr.tolist()
def list_times(alist,scalar):
    for i,val in enumerate(alist):
        alist[i] = val * scalar
    return alist

%timeit arr *1.1
%timeit list_times(larr,1.1)

机器学习之NumPy

2.创建数组并设置数据类型

(1)从列表转换

alist = [1,2,3]
arr = np.array(alist)

(2)np.arange()

arr = np.arange(100)
arr = np.arange(10,100)

(3)np.zeros()

arr = np.zeros(5)
np.zeros((5,5))
cube = np.zeros((5,5,5)).astype(int)+1
cube = np.zeros((5,5,5)).astype(np.float16)
arr = np.zeros(2,dtype=int)
arr = np.zeros(2,dtype=np.float32)

(4)reshape()

arr1d = np.arange(1000)
arr2d = arr1d.reshape((10,10,10))
arr3d = np.reshape(arr1d,(10,10,10))

(5)revel()

作用于reshape相反

(6)shape 显示数据对象的形状

arr1d.shape

3.记录数组

(1)创建记录数组并赋值

recarr = np.zeros((2,),dtype=('i4,f4,a10'))
#创建大小为2的记录数组,类型为4字节整数、4字节浮点数和10字节字符
recarr[:] = [(1,2.,'Hello')(2,3.,'World')]

(2)使用zip()

recarr = np.zeros((2,),dtype=('i4,f4,a10'))
col1 = np.arange(2)+1
col2 = np.arange(2,dtype=np.float32)
col3 = ['Hello','World']
recarr[:] = zip(col1,col2,col3)

(3)为每列数据命名

recarr.dtype.names=('Integers','Floats','Strings')

(4)使用列名访问数据

recarr('Integers')

4.索引和切片

(1)numpy提供了类似matlab的索引和切片

alist=[[1,2],[3,4]]
alist[0][1] #python方式
arr = np.array(alist)
arr[0,1] #单个元素
arr[:,1] #第一列
arr[1,:] #第一行

(2)np.where()

#根据条件获取索引号
index = np.where(arr>2)
new_arr = arr[index]
new_arr = np.delete(arr,index)
#也可以这样操作
index = arr > 2 #得到一个逻辑数组
new_arr = arr[index]

5.NumPy数组的布尔操作

NumPy数组元素可以通过逻辑表达式方便的操作

#创建数组A
img1 = np.zeros((20,20))+3
img1[4:-4,4:-4] = 6
img1[7:-7,7:-7] = 9

#获取数值大于2且小于6的元素索引
index1 = img1 >2
index2 = img1 <6
compound_index = index1& index2
#上式与下式结果相同
compound_index = (img1 >3) & (img1 <7)
img2 = np.copy(img1)
img2[compound_index] = 0
#得到B

index3 = img1 == 9
index4 = (index1 & index2) | index3 
img3 = np.copy(img1)
img3[index4] = 0
#得到C

6.读写操作

(1)Python读写文本文件

f = open('somefile.txt','r') #以只读的方式打开文件
alist = f.readlines() #将文件内容读入列表,每一行为一个列表元素
f.close() #关闭文件


f = open('newtextfile.txt','w') #以可写的方式打开文件
f.writelines(newdata) #写入数据
f.close90 #关闭文件

(2)NumPy文本文件读写

Python读写文本文件虽然方便且效率很好,但是不太适合处理极大的文件,当文件内容有结构,且为数字时用NumPy处理,存在numpy.ndarray会更合适

如:

import numpy as np
arr = np.loadtxt('somefile.txt')
np.savetxt('somefile.txt')

如果文件各列数据类型不一样,则需要指明数据类型,NumPy用来保存数据的类型为recarray,可以用处理ndarray同样的方法来对元素进行操作。recarray数据类型不能直接保存为文本文件,如果需要的话可以使用matplotlib.mlab实现

如:

#文件example.txt的内容如下
#XR21 32.789 1
#XR22 33.091 2

#读入数据
table = np.loadtxt('example.txt',dtype='names':('ID','Result','Type'),'formats':('S4','f4','i2'))

(3)二进制文件

文本文件处理简单方便,但是读写速度和文件大小都不能和二进制文件相比,因此大数据处理适合使用二进制文件。

如:

import numpy as np
data = np.empty((1000,1000)) #创建一个较大的数组
np.save('test.npy',data) #保存数据
np.savez('test.npz',data) #压缩保存数据
newdata = np.load('test.npy') #读入数据

注意:NumPy使用numpy.save和numpy.load来读写二进制文件,但这种二进制文件只能在numpy下读写,scipy.io可以处理更通用的二进制文件

7.数学运算

(1)线性代数

NumPy数组间的运算只是相对应元素间的运算,不能用运算符进行矩阵运算,可以使用numpy.dot和numpy.transpose分别来进行矩阵乘法运算和矩阵转置。其优点在于常规操作时避免了对数据遍历。NumPy的matrix类型则可以直接用运算符进行运算。

如:

import numpy as np
A = np.matrix([[3,6,-5],[1,-3,2],[5,-1,4]]) #定义矩阵
B = np.matrix([[12],[-2],[10]])
X = A ** (-1) * B
print(X)

#使用数组解方程组
import numpy as np
a = np.array([[3,6,-5],[1,-3,2],[5,-1,4]])
b = np.array([12,-2,10])
x = np.linalg.inv(a).dot(b)
print(x)

注意:数组的运算速度更快,而且为了在使用中保持数据类型的一致,建议使用数组。

相关文章: