Python3科学计算库numpy

本文介绍NumPy库的基础使用方法,包括数组创建、读写数据文件、数组操作与计算等核心功能,并通过实例演示如何利用NumPy高效处理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标准安装的 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值