概述

本节主要讲解numpy数组的加减乘除四则运算。

np.array()返回的是numpy的数组,官方称为:ndarray,也就是N维数组对象(矩阵),N-dimensional array object。

这个对象的特性跟矩阵的特性也比较接近,因此我这里有时就将其混称为数组/矩阵了。

数组加法

例如:

import numpy as np
a = np.array([10, 20, 30, 40])
print("a:", a) b = np.arange(4)
print("b:", b) c = a + b
print("c=a+b:", c)

输出结果为:

a: [10 20 30 40]
b: [0 1 2 3]
c=a+b: [10 21 32 43]

从例子中我们可以看出数组/矩阵的加法就是把两个数组/矩阵中对应的元素进行相加,组成一个新的数组/矩阵。

那如果两个数组/矩阵的维度不一样,可否进行相加呢?

比如在上面的例子中,我们如果把b数组的数据修改成自由3个元素的,我们来看下会发生什么事情:

import numpy as np
a = np.array([10, 20, 30, 40])
print("a:", a) b = np.arange(3)
print("b:", b) c = a + b
print("c=a+b:", c)

输出为:

a: [10 20 30 40]
b: [0 1 2]
Traceback (most recent call last):
File "E:/learn/numpy/lesson3/main.py", line 8, in <module>
c = a + b
ValueError: operands could not be broadcast together with shapes (4,) (3,)

直接报错了,也就是如果两个数组/矩阵不是相同维度的,则不能进行相加。

我们再来看个例子:

import numpy as np
a = np.array([10, 20, 30, 40])
print("a:", a) b = 4
print("b:", b) c = a + b
print("c=a+b:", c)

输出为:

a: [10 20 30 40]
b: 4
c=a+b: [14 24 34 44]

在这个例子中,我们用一个数组/矩阵加上一个数字,结果是这个数组/矩阵中的元素分别加上了这个数字组成一个新的数组/矩阵。

那这里这个数字的形状跟a数组/矩阵的形状其实是不一样的,但结果还是能够相加,这是怎么回事呢?

其实,numpy会自动尝试把数字或矩阵进行broadcast操作,以便于尽可能地进行矩阵计算,这里就把单个数字扩展成了跟a数组/矩阵一样形状的数组/矩阵,然后进行数组/矩阵的相加。

而之前那个报错的例子中是因为两个数组/矩阵无法进行扩展成相同的形状而进行数组/矩阵的相加。

数组/矩阵的减法

数组/矩阵减法跟数组/矩阵的加法一样,这里就不重复了。

数组的乘法

看例子:

import numpy as np
a = np.array([10, 20, 30, 40])
print("a:", a) b = np.arange(4)
print("b:", b) c = a * b
print("c=a*b:", c)

输出为:

a: [10 20 30 40]
b: [0 1 2 3]
c=a*b: [ 0 20 60 120]

看起来乘法也不难,就是两个数组中对应元素的相乘,可以认为是矩阵的数乘。

在上面的例子中,如果b=4,则numpy会用用广播(broadcast)方式把数字4扩展成跟a相同维度但其元素都为4的数组,然后再进行对应元素相乘的方式。

具体实现为:

import numpy as np
a = np.array([10, 20, 30, 40])
print("a:", a) b = 4
print("b:", b) c = a * b
print("c=a*b:", c)

输出为:

a: [10 20 30 40]
b: 4
c=a*b: [ 40 80 120 160]

学过线性代数的都知道,在矩阵中有两种乘法:点乘和叉乘。

向量:u=(u1,u2,u3) v=(v1,v2,v3)

点积公式:u * v = u1v1+u2v2+u3v33=lul * lvl * COS(U,V)

叉积公式:u x v = { u2 * v3 - v2 * u3, u3 * v1 - v3 * u1, u1 * v2 - u2 * v1}

这里点乘就是把两个向量中的对应元素相乘后再进行相加,其结果是一个数,在物理上可以用来计算物体在力F的作用下移动位移后所做的功,在几何中可以用来计算两个矢量的夹角,尤其是可以用来证明是否垂直。

用numpy来计算这个矢量的点积就非常方便,例如:

import numpy as np
a = np.array([10, 20, 30, 40])
print("a:", a) b = np.array([1, 2, 3, 4])
print("b:", b) c = np.dot(a, b)
print("c=a * b:", c)

这个例子中矢量的点积就是:(10, 20, 30, 40) * (1, 2, 3, 4)=10 * 1 + 20 * 2 + 30 * 3 + 40 * 4=300

输出结果为:

a: [10 20 30 40]
b: [1 2 3 4]
c=a * b: 300

对于叉积,这里有一个数学上的例子:

对应的numpy实现方式为:

import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6]])
print("a:")
print(a) b = np.array([[1, 4],
[2, 5],
[3, 6]])
print("b:")
print(b) c = np.dot(a, b)
print("c=a x b:")
print(c)

输出为:

a:
[[1 2 3]
[4 5 6]]
b:
[[1 4]
[2 5]
[3 6]]
c=a x b:
[[14 32]
[32 77]]

我们可以发现,numpy中可以用np.dot()函数来同时处理点积和叉积的运算。当输入部分是两个一维数组时,np.dot()就是点积操作,当输入部分是两个二维数组时,进行的就是叉积操作。

其实,点积和叉积的运算规则基本类似的,都是把某批元素同另一批元素进行相乘并求和,这也就是为何numpy可以用dot函数来实现点积和叉积。

数组的n次方

python中的n次方表达为a**n,比如2的10次方:

print(2**10)

输出为:

1024

同理,在numpy数组中,也可以用**n的方式对数组中的每个元素进行n次方的操作,例如:

import numpy as np
a = np.array([1, 2, 3, 4])
print("a=", a) b = a ** 2
print("b = a ** 2=", b)

输出为:

a= [1 2 3 4]
b = a ** 2= [ 1 4 9 16]

数组中的三角函数计算

直接上例子:

import numpy as np
a = np.array([1, 2, 3, 4])
print("a=", a) b = np.sin(a)
print("b = sin(a)=", b)

输出为:

a= [1 2 3 4]
b = sin(a)= [ 0.84147098 0.90929743 0.14112001 -0.7568025 ]

看到这里,我们大体也能知道numpy中数组的运算方式大体都是对数组中的每个元素进行相同的数学运算,从而达到批量处理的效果。

数组同数值比较

直接上例子:

import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a<3)

输出为:

[ True  True False False False]

其运算结果相当于把数组中每个元素同相应的数进行比较,结果数组中的元素就返回True或False。

生成随机数

import numpy as np
a = np.random.random((3, 2))
print(a) b = np.random.rand(3, 2)
print(b)

输出0-1之间的随机数:

[[ 0.55981126  0.39507502]
[ 0.49826522 0.64111042]
[ 0.25806207 0.78056224]]
[[ 0.36580962 0.48456239]
[ 0.55941715 0.5660371 ]
[ 0.13974611 0.97547935]]

矩阵求和、最小、最大值

import numpy as np
a = np.array([1, 2, 3, 4, 5])
print("a=", a) print("sum=", np.sum(a)) print("min=", np.min(a)) print("max=", np.max(a))

输出结果:

a= [1 2 3 4 5]
sum= 15
min= 1
max= 5

对于二维矩阵,我们也可以通过制定求和的轴来指定到底是按行求和还是按列求和。

其中axis=0为按列求和,axis=1为按行求和。例如:

import numpy as np
a = np.array([[5, 10, 15],
[20, 25, 30]])
print("a=")
print(a)
# 列求和
print("axis=0(列求和):", a.sum(axis=0))
# 行求和
print("axis=1(行求和):", a.sum(axis=1))

输出结果:

a=
[[ 5 10 15]
[20 25 30]]
axis=0(列求和): [25 35 45]
axis=1(行求和): [30 75]

对于求最小值和最大值也有同样的axis参数,表示到底是在行中求最小(大)值还是列中求最小(大)值。

numpy的基础运算-【老鱼学numpy】的更多相关文章

  1. numpy创建array【老鱼学numpy】

    在上一篇文章中,我们已经看到了如何通过numpy创建numpy中的数组,这里再重复一下: import numpy as np # 数组 a = [[1, 2, 3], [4, 5, 6]] prin ...

  2. numpy的索引-【老鱼学numpy】

    简单的索引值 import numpy as np a = np.arange(3, 15).reshape(3, 4) print("a=") print(a) print(&q ...

  3. numpy array分割-【老鱼学numpy】

    有合并,就有分割. 本节主要讲述如何通过numpy对数组进行横向/纵向分割. 横向/纵向分割数组 首先创建一个6行4列的数组,然后我们对此数组按照横向进行切割,分成3块,这样每块应该有2行,见例子: ...

  4. numpy的基础运算2-【老鱼学numpy】

    numpy的基础运算中还有很多运算,我们这里再记录一些. 最小/大值索引 前面一篇博文中我们讲述过如何获得数组中的最小值,这里我们获得最小/大值的索引值,也就是这个最小/大值在整个数组中位于第几位. ...

  5. numpy有什么用【老鱼学numpy】

    老鱼为了跟上时代潮流,也开始入门人工智能.机器学习了,瞬时觉得自己有点高大上了:). 从机器学习的实用系列出发,我们会以numpy => pandas => scikit-learn =& ...

  6. python开发环境搭建及numpy基本属性-【老鱼学numpy】

    目的 本节我们将介绍如何搭建python的开发环境以及numpy的基本属性,这样可以检验我们的numpy是否安装正确了. python开发环境的搭建 工欲善其事必先利其器,我用得比较顺手的是Intel ...

  7. numpy安装-【老鱼学numpy】

    要玩numpy,就得要安装numpy. 安装python 3.6.3 64位 首先需要安装python,安装python的具体方法这里就不细讲了. 可以到官网上下载相应的python版本就可以了,目前 ...

  8. numpy的array合并-【老鱼学numpy】

    概述 本节主要讲述如何把两个数组按照行或列进行合并. 按行进行上下合并 例如: import numpy as np a = np.array([1, 1, 1]) b = np.array([2, ...

  9. numpy array的复制-【老鱼学numpy】

    对象的引用 看例子: a = np.array([0, 1, 2, 3]) b = a a[0] = 5 print("b=", b) # 判断a和b是否是同样的地址 print( ...

随机推荐

  1. 五、Java多人博客系统-2.0版本-数据库设计

    数据库设计表如下:文章类别表.文章表.评论表.留言表. 文章列表表:存放文章类别,首页菜单生成也是从这个表取的. 文章表:存放文章标题.发表时间.内容等信息. 评论表:文章评论内容. 留言表:用户发表 ...

  2. Nginx ACCESS阶段 Satisfy 指令

    L:60 这里一定要记住 return 指令所对应的阶段 早与access 因此如果location 有return 的话 那么 deny可能都会失效

  3. WebViewClient 与 WebChromeClient

    WebViewClient帮助WebView处理各种通知和请求事件的,我们可以称他为WebView的“内政大臣”.常用的shouldOverrideUrlLoading就是该类的一个方法,比如: on ...

  4. Ubuntu16.04安装Redis并配置

    Ubuntu16.04安装Redis并配置 2018年05月22日 10:40:35 Hello_刘 阅读数:29146   Ubuntu16.04安装Redis并配置 1):安装: 1:终端命令下载 ...

  5. Vivado2016旧工程IP移动到新工程

    前言 在VIVADO中图形化界面生成IP,在旧工程中使用后,如果想在新的工程中使用这个IP但又不想再次生成一次,则就需要把就旧工程中的IP导入到新工程中. 流程 1.旧工程IP生成的目录如下,IP为C ...

  6. Codeforces #381(div2)

    A.题目:http://codeforces.com/contest/740/problem/A 题意:现有n本书,买一本书需要花a元,两本书b元,三本书c元,问买够书是4的倍数所需要的最小花费 思路 ...

  7. Codeforces 1077D Cutting Out(二分答案)

    题目链接:Cutting Out 题意:给定一个n长度的数字序列s,要求得到一个k长度的数字序列t,每次从s序列中删掉完整的序列t,求出能删次数最多的那个数字序列t. 题解:数字序列s先转换成不重复的 ...

  8. 用expect实现SCP/SSH自动输入密码登录

    在命令行ssh远程登录服务器和scp远程传输文件都需要交互式输入密码,无法像mysql登录数据库 mysql -uroot -p123456一样直接完成. 其实可以用脚本依赖expect来达到这一目的 ...

  9. 应用调试(五)侵入式SWI

    目录 应用调试(五)侵入式SWI 场景应用 测试程序 修改APP的bin 修改SWI 获得当前进程的寄存器 测试运行 恢复代码 进程间内存拷贝 TODO 更多参考文献 title: 应用调试(五)侵入 ...

  10. 应用调试(二)GDB

    title: 应用调试(二)GDBdate: 2019/1/17 21:00:10 toc: true 应用调试(二)GDB gdb下载工具安装交叉工具链设置GDB介绍编译GDBtarget/host ...