问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

numpy的矢量化运算是怎么实现的

发布网友 发布时间:2022-04-30 07:29

我来回答

2个回答

懂视网 时间:2022-05-10 13:58

前言

在python 中有时候我们用数组操作数据可以极大的提升数据的处理效率,类似于R的向量化操作,是的数据的操作趋于简单化,在python 中是使用numpy模块可以进行数组和矢量计算。

下面来看下简单的例子


import numpy as np
 
data=np.array([2,5,6,8,3]) #构造一个简单的数组
 
print(data)


结果:


[2 5 6 8 3]



data1=np.array([[2,5,6,8,3],np.arange(5)]) #构建一个二维数组
 
print(data1)


结果:


[[2 5 6 8 3]
[0 1 2 3 4]]


我们也可以通过shape和dtype方法查看数组的维度和数据格式


print(data.shape)
print(data.dtype)
print(data1.shape)
print(data1.dtype)


结果:


(5,)
int32

(2, 5)
int32


可以看出data是一维数组,每组元素为5个,数据类型为32位int 类型

data1 为二维数组,每个组有5个元素,数据类型为32位int类型

有一个较好的区分方法是看打印结果中,中括号的层数和位置,就可以看出数组的维度,一层中括号代表一个维度。

其他的数组属性方法还有:

array.ndim 数组的维数,一维数组结果为1,二维数组打印结果为2

array.size 数组的元素个数

array.itemsiz 数组每个元素的字节大小

接下来我们了解下数组中的数据类型:

NumPy中的基本数据类型


名称描述
bool用一个字节存储的布尔类型(True或False)
inti由所在平台决定其大小的整数(一般为int32或int64)
int8一个字节大小,-128 至 127
int16整数,-32768 至 32767
int32整数,-2 ** 31 至 2 ** 32 -1
int64整数,-2 ** 63 至 2 ** 63 - 1
uint8无符号整数,0 至 255
uint16无符号整数,0 至 65535
uint32无符号整数,0 至 2 ** 32 - 1
uint64无符号整数,0 至 2 ** 64 - 1
float16半精度浮点数:16位,正负号1位,指数5位,精度10位
float32单精度浮点数:32位,正负号1位,指数8位,精度23位
float64或float双精度浮点数:64位,正负号1位,指数11位,精度52位
complex64复数,分别用两个32位浮点数表示实部和虚部
complex128或complex复数,分别用两个64位浮点数表示实部和虚部

基础的数组运算

数组也可以进行我们常用的加减乘除运算


arr=np.array(np.arange(10))
arr1=np.array(np.arange(1,11))
print(arr*2)


结果:


[ 0 2 4 6 8 10 12 14 16 18]



print(arr+arr1)


结果:


[ 1 3 5 7 9 11 13 15 17 19]


注意,相加两个数组长度要一样

接下来我们看下数组索引


arr=np.arange(10)


用下标直接进行索引


print(arr[5])


结果为:


5


切片索引


print(arr[5:8])


结果为:


[5 6 7]


可以利用索引对数据进行更改操作


arr[5]=120
print(arr)


结果为:


[ 0 1 2 3 4 120 6 7 8 9]


可以看到下标为5的数已经变成120了。

此外,数组还可以进行布尔操作


arr=np.arange(5)
name=np.array(['a','b','b','c','a'])
print(name=='a')


结果为:


[ True False False False True]


即满足条件的数据全部以True的结果输出。

接下来我们可以利用name数组设置条件后的布尔值对arr数组进行相关操作


print(arr[name=='a'])


结果为:


[0 4]


即把arr中对应于name中a相对应位置的元素打印出来。

多条件操作


result=(name='a')|(name='c')
print(result)
print(name[result])


结果为:


[ True False False True True]
['a' 'c' 'a']


接下来,我们了解下ufunc方法

用于操作单个数组的函数有如下:

用于操作两个或多个数组的方法

相关的函数方法使用

np.meshgrid 用于生成多维矩阵


a,b=np.meshgrid(np.arange(1,5),np.arange(2,4))
print(a)
print(b)


结果为:


[[1 2 3 4]
[1 2 3 4]]
[[2 2 2 2]
[3 3 3 3]]


按照数据最少的数组形成数组

np.where 是三元表达式 x if condition else y的矢量化版本


arr1=np.arange(5)
arr2=np.arange(20,25)
condition=np.array([1,0,1,0,0])
result=np.where(condition,arr1,arr2)
print(arr1)
print(arr2)
print(result)


结果为:


[0 1 2 3 4]
[20 21 22 23 24]
[ 0 21 2 23 24]


可以看出,result的结果中,条件为1的显示数组arr1的内容,条件为0的显示arr2的内容

数学统计方法

在数组中我们也可以使用数学统计方法进行计数,例如sum mean std 等


arr=np.random.randint(1,20,10)
print(arr)
print(np.mean(arr))
print(np.sum(arr))
print(np.std(arr))


结果为:


[19 14 8 13 13 10 10 9 19 7]
12.2
122
4.01995024845


具体的方法内容如下图所示:

布尔型数组的相关统计方法


arr=np.arange(-20,10)
result=(arr>5).sum()
print(arr)
print(result)


结果为:


-20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3
-2 -1 0 1 2 3 4 5 6 7 8 9]

4


可以对数据进行判断后进行个数求和

其他的数组方法还有

数据的读取和存储

线性函数的常用方法


arr=np.array([np.random.randint(1,10,5),np.random.randint(10,20,5)])
print(arr)
print(np.dot(arr,2))


结果为


[[ 4 6 5 1 6]
[14 16 11 10 18]]
[[ 8 12 10 2 12]
[28 32 22 20 36]]


dot方法可以进行矩阵相乘操作

其他方法如下图

最后我们了解下numpy中的随机数生成方法

上面的很多例子中我们已经用到了随机数生成,


arr=np.random.random(10)
print(arr)


结果为


[ 0.90051063 0.72818635 0.00411373 0.13154345 0.45513344 0.9700776
0.42150977 0.27728599 0.50888291 0.62288808]


其他形式的随机数生成方法

更多python中numpy基础学习及进行数组和矢量计算相关文章请关注PHP中文网!

热心网友 时间:2022-05-10 11:06

矢量化指的是用数组表达式代替循环来操作数组里的每个元素。
NumPy提供的通用函数(既ufunc函数)是一种对ndarray中的数据进行元素级别运算的函数。
例如,square函数计算各元素的平方,rint函数将各元素四舍五入:
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
酸菜坛中盐加多了怎么办 想问问上海附近的城市有哪些小吃特别多的地方,想去放松一下心情。谢... 有一个鬼片开始是好像中国解放,然后好像是妓院引起火最后那里的人被烧死... <鬼片》讲一个女人在上里被货车撞死后埋在山里变鬼报复的电影_百度知 ... 比最小的九位数少1的数是( ),比最大的九位数多1的数是( )A.99999999B... 苹果6Spuls花屏咋回事求大神 梦幻西游飞升降修炼,是系统自动帮你降修,提高修炼上限吗?不是自己不... 小马宝莉公主图片 谁要小马宝莉公主的照片?可以发给我些吗? 浙江职工医保缴费最低每月多少 一个手机号怎么登录两个 google earth 矢量化数据导入ArcGIS后形状奇怪 google earth 矢量化的数据怎样转换坐标后与原来数据同时显示在arcgis中? 如何使用GIS矢量化和栅格化数据 电脑怎么登录两个 Django连接mysql时,配置文件数据库连接池之后,启动服务器出错。 电脑怎么登录两个 母螃蟹产卵后没公螃蟹怎么孵化 双卡手机怎么用两个? word 档怎么转换成excel 如何同时登两个 一个手机如何同时登录两个? 一个手机登两个怎么登? 该如何吃阿胶? 阿胶食用方法 服用东阿阿胶有哪些注意事项 用药需细心 梦见很大一座观音菩萨像 有几百米高 我还走进莲花座下 里面有和尚 是什么意识啊 急!!!求<<青蛙军团爱地球>>全文,是全文啦!!不是第四第五章!!! 为什么连苹果手机都无法去掉的刘海,小米却可 谁有作文有;‘‘一件有意义的事啊’’?快啊,我有用。。。 gis矢量数据的获取方式主要有哪些 华为手机如何同时登录两个? arcgis中arcsan中的矢量化无法生成要素? 屏幕跟踪矢量化 电脑上怎么同时登陆两个 一个手机登两个怎么登? 狗肉好吃吗?怎么吃 青辣椒和狗肉包包子好吃吗? 网上说狗肉不好是真的吗?沛县狗肉网上哪儿有卖? 当别人对你说肉包子打狗,你应该怎么说回去? 易县旅游,五一易县旅游,易县有什么特色小吃 3顿饭,一桩婚,餐桌上不被尊重的女人,为何不会幸福? 狗是人类最忠诚的朋友,为什么还有人吃狗? 《小欢喜》:比离婚更伤害孩子的4件事,为何你也许天天都在做? 文学作品中有哪些关于食物的描写? 怎么开蛋糕私房工作室 怎么一起线上看本地视频 去哪里能学到狗肉做法 什么手机软件可以跟好友一起看本地视频? 有没有异地同步看视频的软件?