数组的四则运算

在numpy模块中,实现四则运算的计算既可以使用运算符号,也可以使用函数,具体如下例所示:

#加法运算

import numpy as np
math = np.array([98,83,86,92,67,82])
english = np.array([68,74,66,82,75,89])
chinese = np.array([92,83,76,85,87,77])
tot_symbol = math+english+chinese
tot_fun = np.add(np.add(math,english),chinese) #add 加法
print('符号加法:\n',tot_symbol)
print('函数加法:\n',tot_fun)

#除法
height = np.array([165,177,158,169,173])
weight = np.array([62,73,59,72,80])
BMI_symbol = weight/(height/100)**2
BMI_fun = np.divide(weight,np.divide(height,100)**2) #divide 除法
print('符号除法:\n',BMI_symbol)
print('函数除法:\n',BMI_fun)

out:

符号加法:
[258 240 228 259 229 248]
函数加法:
[258 240 228 259 229 248]
符号除法:
[22.77318641 23.30109483 23.63403301 25.20920136 26.7299275 ]
函数除法:
[22.77318641 23.30109483 23.63403301 25.20920136 26.7299275 ]

四则运算中的符号分别是“+-*/”,对应的numpy模块函数分别是np.add np.subtract,np.multiply,np.divide.需要注意的是,函数只能接受两个对象的运算,如果需要多个对象的运算,就得使用嵌套方法。如上所示的符号假发和符号的除法。不管是符号方法还是函数方法,都必须保证操作的数组具有相同的形状,除了数组与标量之间的运算(如除法中的身高与100的商)。另外,还有三个数学运算符,分别是余数,整数和指数:

import numpy as np
arr7 = np.array([[1,2,10],[10,8,3],[7,6,5]])
arr8 = np.array([[2,2,2],[3,3,4],[4,4,4]])
print('数组arr7:\n',arr7)
print('数组arr8:\n',arr8)
print('求余计算:\n',arr7 % arr8)
print('整除:\n',arr7 // arr8)    #这里面要注意的就是  整除的时候 是  “//”而不是 "/"
print('计算指数:\n',arr7 ** arr8)

out:

数组arr7:
[[ 1 2 10]
[10 8 3]
[ 7 6 5]]
数组arr8:
[[2 2 2]
[3 3 4]
[4 4 4]]
求余计算:
[[1 0 0]
[1 2 3]
[3 2 1]]
整除:
[[0 1 5]
[3 2 0]
[1 1 1]]
计算指数:
[[ 1 4 100]
[1000 512 81]
[2401 1296 625]]

另外还可以使用np.fmod,np.modf和np.power,但是整除的函数应用会稍微复杂一点,需要写成np.modf(arr7/arr8)[1],因为modf可以返回

数值的小数部分和整数部分,而整数部分就是要取的整除值。

比较运算

处理数组的元素之间可以实现上面提到的数学运算,还可以做元素的比较运算。关于比较运算符如下:

符号 函数 含义
> np.greater(arr1,arr2) 判断arr1的元素是否大于arr2的元素
>= np.greater_equal(arr1,arr2) 判断arr1的元素是否大于等于arr2的元素
< np.less(arr1,arr2) 判断arr1的元素是否小于arr2的元素
<= np.less_equal(arr1,arr2) 判断arr1的元素是否小于等于arr2的元素
== np.equal(arr1,arr2) 判断arr1的元素是否等于arr2的元素
!= np.not_equal(arr1,arr2) 判断arr1的元素是否小等于arr2的元素
     

运用比较运算符可以返回bool类型的值,即True和False。有两种情况会普遍使用到比较运算符,一个是从数组中查询满足条件的元素,另一个是根据判断的结果执行不同的操作。例如:

import numpy as np
arr7 = np.array([[1,2,10],[10,8,3],[7,6,5]])
arr8 = np.array([[2,2,2],[3,3,2],[4,4,4]])
print(arr7)
print('从arr7中取出所有大于arr8的元素',arr7[arr7>arr8])    #取出的是所有arr7中对应的元素大于arr8中对应位置的元素
arr9 = np.array([3,10,23,7,15,9,17,22,4,8,16])
print('取出arr9中所有大于10的元素',arr9[arr9>10])   #得到的是一个一维数组  相当于每个数组中的元素都会跟10来进行比较

print(np.greater(arr7,arr8)) #输出的是原数组结构的布尔型元素的数组

out:

[[ 1  2 10]
[10 8 3]
[ 7 6 5]]
从arr7中取出所有大于arr8的元素 [10 10 8 3 7 6 5]
取出arr9中所有大于10的元素 [23 15 17 22 16]
[[False False True]
[ True True True]
[ True True True]]

广播运算

上面介绍的是相同形状的数组,当数组形状不同时,也能够进行数学运算的功能成为数组的广播。数组的广播是有规则的,如果不满足这些规则就会出错;规则如下:

a.各输入数组的维度可以不相等,但必须确保从右到左维度值相等。

b.如果对应维度值不相等,就必须保证其中一个为1.

c.各输入数组都向其shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐

下面通过实例来加强理解

import numpy as np
arr10 = np.arange(12).reshape(3,4)                             #arange(12)表示生成从0-11总共12个数组元素组成的数组,然后通过reshape编                                                                                          #成3行4列的二维数组
arr11 = np.arange(101,113).reshape(3,4)                    #同上面arange(101,113)就是生成从 101到112的元素的数组
print('3x4的二维矩阵运算:\n',arr10 + arr11)
arr12 = np.arange(60).reshape(5,4,3)                          #这是个三维数组,我们可以理解为一个长5宽为4高为3的魔方
arr10 = np.arange(12).reshape(4,3)                             #4行3列的二维数组
print('维数不一致,但末尾的维度值一致:\n',arr12 + arr10)               #我们可以这么看,reshape(5,4,3)其实里面相当于包含了 5个                                                                                                                           #reshape(4,3)的二维数组,末尾两个维度相同,可以进行运算
arr12 = np.arange(60).reshape(5,4,3)
arr13 = np.arange(4).reshape(4,1)                                #这个里面末尾的维度虽然一个是‘’4,3‘’,一个是“4,1”因为后面的数组末尾维度                                                                                           #中其中一个是‘’1‘’,所以是可以进行运算的
print('维数不一致,维数值也不一致,但维度值至少一个为1:\n',arr12+arr13)              #就是在5个(4行3列)的数组中,每行的各个元素对                                                                                                                                          #应加0,1,2,3
arr14 = np.array([5,15,25])
print('arr14的维度自动补齐为(1,3): \n',arr10 + arr14)                                   #每行对应位置元素分别加上 5,15,25

out:

3x4的二维矩阵运算:
[[101 103 105 107]
[109 111 113 115]
[117 119 121 123]]
维数不一致,但末尾的维度值一致:
[[[ 0 2 4]
[ 6 8 10]
[12 14 16]
[18 20 22]] [[12 14 16]
[18 20 22]
[24 26 28]
[30 32 34]] [[24 26 28]
[30 32 34]
[36 38 40]
[42 44 46]] [[36 38 40]
[42 44 46]
[48 50 52]
[54 56 58]] [[48 50 52]
[54 56 58]
[60 62 64]
[66 68 70]]]
维数不一致,维数值也不一致,但维度值至少一个为1:
[[[ 0 1 2]
[ 4 5 6]
[ 8 9 10]
[12 13 14]] [[12 13 14]
[16 17 18]
[20 21 22]
[24 25 26]] [[24 25 26]
[28 29 30]
[32 33 34]
[36 37 38]] [[36 37 38]
[40 41 42]
[44 45 46]
[48 49 50]] [[48 49 50]
[52 53 54]
[56 57 58]
[60 61 62]]]
arr14的维度自动补齐为(1,3):
[[ 5 16 27]
[ 8 19 30]
[11 22 33]
[14 25 36]]

以上的操作,根据备注去理解,平时多维数组方面的应用比较少,能理解这些规则是怎么来的就可以了,需要用到的时候再深究。

python numpy数组操作2的更多相关文章

  1. python numpy数组操作

    数组的创建 import numpy as np arr1 = np.array([3,10,8,7,34,11,28,72]) arr2 = np.array(((8.5,6,4.1,2,0.7), ...

  2. Numpy 数组操作

    Numpy 数组操作 Numpy 中包含了一些函数用于处理数组,大概可分为以下几类: 修改数组形状 翻转数组 修改数组维度 连接数组 分割数组 数组元素的添加与删除 修改数组形状 函数 描述 resh ...

  3. Numpy数组操作

    """ Numpy 数组操作 修改数组形状 函数 描述 reshape 不改变数据的条件下修改形状 flat 数组元素迭代器 flatten 返回一份数组拷贝,对拷贝所做 ...

  4. python numpy 数组拼接

    我就写一下我遇到的,更多具体的请看Python之Numpy数组拼接,组合,连接 >>> aarray([0, 1, 2],       [3, 4, 5],       [6, 7, ...

  5. Python Numpy线性代数操作

    Python Numpy线性代数函数操作 1.使用dot计算矩阵乘法 import numpy as np from numpy import ones from __builtin__ import ...

  6. Python+OpenCV图像处理(三)—— Numpy数组操作图片

    一.改变图片每个像素点每个通道的灰度值 (一) 代码如下: #遍历访问图片每个像素点,并修改相应的RGB import cv2 as cv def access_pixels(image): prin ...

  7. Python Numpy 数组的初始化和基本操作

    一.基础: Numpy的主要数据类型是ndarray,即多维数组.它有以下几个属性: ndarray.ndim:数组的维数 ndarray.shape:数组每一维的大小 ndarray.size:数组 ...

  8. 9、numpy——数组操作

    Numpy 中包含了一些函数用于处理数组,大概可分为以下几类: (1)修改数组形状 (2)翻转数组 (3)修改数组维度 (4)连接数组 (5)分割数组 (6)数组元素的添加与删除 1.修改数组形状 函 ...

  9. 吴裕雄--天生自然Numpy库学习笔记:Numpy 数组操作

    import numpy as np a = np.arange(8) print ('原始数组:') print (a) print ('\n') b = a.reshape(4,2) print ...

随机推荐

  1. JVM详解之:汇编角度理解本地变量的生命周期

    目录 简介 本地变量的生命周期 举例说明 优化的原因 总结 简介 java方法中定义的变量,它的生命周期是什么样的呢?是不是一定要等到方法结束,这个创建的对象才会被回收呢? 带着这个问题我们来看一下今 ...

  2. c++ 第二天 命名空间、数组

    C++ 命名空间 命名空间,也就是名称空间/名字空间,注意需要的头文件是 iostream ,而不是 iostream.h ,后者是旧版本的 C++ 头文件,并不支持命名空间. 为什么要使用命名空间? ...

  3. 【JMicro】微服务开发及使用

    JMicro是一个用Java语言实现的开源微服务全家桶, 源码地址:https://github.com/mynewworldyyl/jmicro, Demo地址:http://124.70.152. ...

  4. K近邻算法(一)

    K 近邻算法思想: 寻找该点周围最近的K个点.根据这K 个点的类别来判断该点的类别: 核心: 数据归一化.(在必要的时候必须进行数据归一化处理,防止某一特征在计算数据时占比较重) 计算欧拉距离 . 使 ...

  5. Python 图像处理 OpenCV (16):图像直方图

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  6. 国浩:Cassandra在360的最新进展

    大家好,我是来自奇虎360的国浩.今天我给大家带来的是Cassandra在360的最新进展. 我会从四个方面来介绍Cassandra在360的应用情况:Cassandra在360的使用历史再结合两个案 ...

  7. Chrome-AdGuard 无与伦比的广告拦截扩展

    一款无与伦比的广告拦截扩展,对抗各式广告与弹窗. AdGuard 广告拦截器可有效的拦截所有网页上的所有类型的广告,甚至是在 Facebook.Youtube 以及其他万千网站上的广告! AdGuar ...

  8. cryptopp使用Qt mingw编译,以及海思平台交叉编译

    编译工程生成,使用qmake生成qt工程文件(海思平台时,要用海思平台的qmake),将 TEMPLATE = app 修改为: TEMPLATE = lib 添加如下: win32:LIBS += ...

  9. Hive: Reflect UDF

    Reflect UDF JAVA类和方法通常用于处理用户希望在hive中使用的确切的函数.相比与封装一个UDF然后调用这个方法,这些 方法主要通过反射UDF去调用.Reflect使用Java反射去实例 ...

  10. 18、Memento 备忘录模式

    例如:用于记录快照(顺势状态).存盘 1.Memento Memento设计模式是一种软件设计模式,用于将对象回滚到其先前状态.它是行为设计模式的一部分,与算法和对象之间的职责分配有关. 行为模式描述 ...