标准安装的 Python 中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有 3 个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和 CPU 计算时间。
NumPy 的诞生弥补了这些不足,NumPy 提供了两种基本的对象:ndarray(N-dimensional array object)是存储单一数据类型的多维数组,ufunc(universal function)是能够对数组的每个元素进行处理的函数。NumPy 内置的许多ufunc 函数都在 C 语言级别实现的,因此它们的计算速度非常快。
把数据转换成矩阵的形式,用numpy封装函数对矩阵进行操作。
用numpy读写数据文件
example=open('drink.txt','w+') ##写一个数据文件drink.txt
example.write('Year,WHO_Region,Country,Beverage Types,Display Value\
\n1986,Western Pacific,Viet Nam,Wine,0\
\n1986,Americas,Uruguay,Other,0.5\
\n1985,Africa,Cte d\'Ivoire,Wine,1.62')
example.close()
example=open('drink.txt','r+')
print(example.read())
import numpy
drink=numpy.genfromtxt('drink.txt',delimiter=',')
##genfromtxt读取数据集,存成array格式;delimiter是分割值,表示数组用什么来分割
print(type(drink))
用numpy创建数组
(1)arange方法创建向量数组,reshape改变数组维度
import numpy as np
A=np.arange(15) #arange创建数组
print(A)
a=A.reshape(3,5) #reshape定义数组维度大小
print(a)
ash=a.shape #shape查看数组a各维度大小
print(ash)
print(a.ndim) #ndim查看数组是几维的
print(a.dtype.name) #dtype.name查看数组内元素数据类型
print(a.size) #size查看数组里一共有多少元素
(2)zeros方法,创建全0数组,注意数组维度是括号
nz=np.zeros((3,4))
print(nz)
no=np.ones((2,3,4),dtype=np.float32)
print(no)
(3)random方法,创建随机数组
nr=np.random.random((2,3)) #np.random.random生成(0,1)间的随机数组
print(nr)
from numpy import pi
npi=np.linspace(0,2*pi,10) #linspace给定首尾间隔,等分
print(npi)
ns=np.sin(npi) #sin对给定数组每个元素取正弦
print(ns)
(4)array方法,创建向量矩阵
import numpy
vector=numpy.array([5,10,15,20]) #array创建数组
print(vector)
matrix=numpy.array([[5,10,15],[20,25,30]])
print(matrix)
shape方法,查取array数组维度
print(vector.shape) #(4,) 4个元素的向量
print(matrix.shape) #(2, 3) 2行3列
dtype方法,查看类型
##numpy.array数据格式里的元素必须是相同数据类型的
numbers=numpy.array([1,2,3,4])
print(numbers.dtype)
#bool(True,False)
#int(int16,int32,int64)
#float(float16,float32,float64)
#string(string,unicode)
dtype参数,数据类型设置
import numpy
drink=numpy.genfromtxt('drink.txt',delimiter=',')
print(drink) #默认转换成浮点数,转换不成float格式,会出现值缺失表示nan
drink1=numpy.genfromtxt('drink.txt',delimiter=',',dtype='str') #dtype参数指定数据格式
print(drink1)
drink2=numpy.genfromtxt('drink.txt',delimiter=',',dtype='U75',skip_header=1) #skip_header去掉第一行
print(drink2)
astype方法,对数组元素类型转换
vector=numpy.array(["1","2","3"])
print(vector.dtype);print(vector)
vector=vector.astype(float) #astype转换数据类型
print(vector.dtype);print(vector)
对数组元素进行取值操作(分片)
getnum=drink2[1,4];getnum1=drink2[2,2] #按索引号[行,列]取单个元素
print(getnum);print(getnum1)
vector=numpy.array([5,10,15,20])
print(vector)
print(vector[0:3]) #向量分片取值,取前3个值,索引“左闭右开”
matrix=numpy.array([[5,10,15],[20,25,30],[35,40,45]])
print(matrix)
print(matrix[:,1]) #矩阵取某一列
print(matrix[:,0:2]) #矩阵分片取值,取前2列值,索引“左闭右开”
print(matrix[1:3,0:2])#矩阵分片取值,取后2行的前2列
对数组中元素进行整体操作(boolean)
vector=numpy.array([5,10,15,20])
print(vector==10) #对数组里的元素进行值判断
equal_to_ten=(vector==10) #这种变量相当于找到了一个“位置”,True表示位置
print(equal_to_ten)
print(vector[equal_to_ten]) #对数组里的元素进行取值,只取True的值
matrix=numpy.array([[5,10,15],[20,25,30],[35,40,45]])
print(matrix==25)
second_column_25=(matrix[:,1]==25)
print(second_column_25)
print(matrix[second_column_25,:]) #对数组取布尔值True确定的行
vector=numpy.array([5,10,15,20])
print(vector)
equal_to_ten_and_five=(vector==10)&(vector==5) #&与
print(equal_to_ten_and_five)
equal_to_ten_or_five=(vector==10)|(vector==5) #|或
print(equal_to_ten_or_five)
vector[equal_to_ten_or_five]=50 #对True的位置赋值
print(vector)
matrix=numpy.array([[5,10,15],[20,25,30],[35,40,45]])
second_column_25=matrix[:,1]==25
print(second_column_25)
matrix[second_column_25,1]=10 #对second_column_25的行的索引1位置元素赋值10
print(matrix)
对数组中元素进行数值计算API
vector=numpy.array([5,10,15,20])
vsum=vector.sum() #求和
print(vsum)
vmax=vector.max() #求最大值
print(vmax)
vmin=vector.min() #求最小值
print(vmin)
vmean=vector.mean() #求均值
print(vmean)
matrix=numpy.array([[5,10,15],[20,25,30],[35,40,45]])
mhsum=matrix.sum(axis=1) #axis=1表示按行操作,axis=0表示按列操作
print(mhsum)
mlsum=matrix.sum(axis=0)
print(mlsum)
nan值检测和替换
drink=numpy.genfromtxt('drink.txt',delimiter=',',skip_header=1)
print(drink)
is_value_empty=numpy.isnan(drink[:,3]) #isnan判断值是否是nan,返回布尔值
print(is_value_empty)
drink[is_value_empty,3]='0' #对is_value_empty是nan样本的第3索引"列"赋值‘0’#####
print(drink)
drink_3index_column=drink[:,3] #对第3索引"列"进行数据类型转换
drink_3index_column=drink_3index_column.astype(float)
drink_3index_column_sum=drink_3index_column.sum()
drink_3index_column_mean=drink_3index_column.mean()
print(drink_3index_column_sum)
print(drink_3index_column_mean)
对两个数组进行操作
a=np.array([20,30,40,50])
b=np.arange(4)
c=a-b
print(a);print(b);print(c)
print(b**2);print(a<35)
A=np.array([[1,1],[0,1]]);print(A)
B=np.array([[2,0],[3,4]]);print(B)
print(A*B) #对应元素内积
print(A.dot(B)) #dot常规矩阵乘法
print(np.dot(A,B))
对单个数组整体进行函数操作
import numpy as np
B=np.arange(3)
print(B)
print(np.exp(B)) #exp对数组每个元素取e指数计算
print(np.sqrt(B)) #sqrt对数组每个元素取平方根
a=np.floor(10*np.random.random((3,4)));print(a) #floor向下取整
print(a.shape)
ravel方法,对矩阵“拉长”
a=np.floor(10*np.random.random((3,4)));print(a)
print(a.ravel()) #ravel矩阵按行拉长
a.shape=(6,2)
print(a);print(a.T) #a.T对a数组取转置
vstack,hstack方法,对两个数组“拼接”
a=np.floor(10*np.random.random((2,2)))
b=np.floor(10*np.random.random((2,2)))
print(a),print(b)
print(np.vstack((a,b))) #vstack将数组a,b竖直拼接vertical
print(np.hstack((a,b))) #hstack将数组a,b水平拼接horizontal
vsplit,hsplit方法,对数组“切分”
a=np.floor(10*np.random.random((2,12)))
print(a)
print(np.hsplit(a,3)) #hsplit将数组a在水平方向切分成3等分
a1=np.floor(10*np.random.random((2,12)))
print(a1)
print(np.hsplit(a1,(3,4))) #hsplit将数组a在水平方向切分,从列索引3前切,到列索引4前停止
b=np.floor(10*np.random.random((12,2)))
print(b)
print(np.vsplit(b,3)) #vsplit将数组b在竖直方向切分成3等分
数组赋值后指向:直接赋值,浅复制,深复制
a=np.arange(12)
b=a
print(b is a) #赋值后,b和a指向同一个内存地址
b.shape=3,4
print('b维度变成(3,4)后a的维度:',a.shape)
print('a的id:',id(a));print('b的id:',id(b)) #取a,b在内存里的id
print('_________________________________')
c=a.view() #c是对a的浅复制,两个数组不同,但数据共享
print(c is a)
c.shape=2,6
print(a.shape); #c的形态变量,a的形态没变
print('对c赋值前的a:\n',a);
c[0,4]=1234;print('c:\n',c);print('对c赋值后的a:\n',a) #c的[0,4]位置数据改变,a也改变
print('_________________________________')
d=a.copy() #d是对a的深复制,两个数组不同,数据也不共享
print(d is a)
d[0,0]=9999
print('d:\n',d);print('a:\n',a)
print('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
##在数组中找最大值的位置
import numpy as np
data=np.sin(np.arange(20)).reshape(5,4)
print('初始数据:\n',data)
index=data.argmax(axis=0) #argmax找每列的最大值位置
print('每一列最大值的索引:',index)
data_max=data[index,range(data.shape[1])] #根据索引index找出data数组里的元素!!!
print('根据索引找出最大值:',data_max)
print('直接办法取最大值:',data.max(axis=0)) #array.max(axis=0)
print('检测两种办法取到的max是否一致:',all(data_max==data.max(axis=0)))
print('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
##对数组中元素“排序”
print('(1.)sort方法作用类np上<对象参数a不变,生成数组新开辟空间给b>:')
a=np.array([[4,3,5],[1,2,1]])
print('np.sort对a进行行排序前的a:\n',a)
b=np.sort(a,axis=1) #sort对数组a里的元素按行排序
print('对a进行行排序后的b:\n',b)
print('np.sort对a进行行排序后的a:\n',a)
print('a的id:',id(a));print('b的id:',id(b))
print('(2.)sort方法作用对象a上,a被改变:')
a.sort(axis=1)
print(a)
print('a的id:',id(a))
print('_________________________________')
#返回最大值的索引
aa=np.array([0.4,0.3,0.1,0.2])
print('初始aa数组:',aa)
j=np.argsort(aa)
print('对aa元素排序后的索引位置:',j)
print('根据索引的排序对aa重排:',aa[j])
print('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
##对数组进行复制
a=np.arange(0,40,10)
print(a)
b=np.tile(a,(4,1)) #tile对a进行4行1列的复制
print(b)