欢迎关注公众号【Python开发实战】, 获取更多内容!

工具-numpy

numpy是使用Python进行数据科学的基础库。numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变换和随机数函数。

算术运算

导入numpy

import numpy as np

所有常用的算术运算+,-,*,/,//,%,**等等,都可以应用在ndarray上,且这些运算是方面级的。

a = np.array([14, 23, 32, 4])
b = np.array([5, 4, 3, 2])
print('a + b =', a + b)
print('a - b =', a - b)
print('a * b =', a * b)
print('a / b =', a / b)
print('a // b =', a // b)
print('a % b =', a % b)
print('a ** b =', a ** b)

输出:

a + b = [19 27 35  6]
a - b = [ 9 19 29 2]
a * b = [70 92 96 8]
a / b = [ 2.8 5.75 10.66666667 2. ]
a // b = [ 2 5 10 2]
a % b = [4 3 2 0]
a ** b = [537824 279841 32768 16]

需要注意的是,上面的乘法运算不是矩阵乘法,下面会介绍矩阵乘法。

上面算术运算的前提是ndarray必须有一样的形状,否则numpy将会应用广播机制。

广播

第一条规则

当ndarray没有相同的秩时,那么将为秩较小ndarray的形状数组上加入1,直到他们的秩匹配为止。

h = np.arange(5).reshape(1, 1, 5)
h

输出:

array([[[0, 1, 2, 3, 4]]])

现在尝试将一个形状为(5,)的一维数组加到这个形状为(1,1,5)的三维数组上,遵循第一条广播规则,结果如下:

h + np.array([10, 20, 30, 40, 50])   # 相当于h + np.array([[[10, 20, 30, 40, 50]]])

输出:

array([[[10, 21, 32, 43, 54]]])

第二条规则

在特定维度为1的数组,沿着该维度将元素的值进行重复,直到和在该维度上拥有最大形状的ndarray大小相同为止。

k = np.arange(6).reshape(2, 3)
k

输出:

array([[0, 1, 2],
[3, 4, 5]])

现在让一个形状为(2,1)的二维ndarray加到形状为(2, 3)的二维数组上,numpy将会应用第二条广播规则。

k + np.array([[100], [200]])  # 相当于 k + =np.array([[100, 100, 100], [200, 200, 200]])

输出:

array([[100, 101, 102],
[203, 204, 205]])

结合规则1和规则2:

k + np.array([100, 200, 300]) # 应用规则1: [[100, 200, 300]], 再应用规则2:[[100, 200, 300], [100, 200, 300]]

输出:

array([[100, 201, 302],
[103, 204, 305]])
k + 1000 # 相当于 k + [[1000, 1000, 1000], [1000, 1000, 1000]]

输出:

array([[1000, 1001, 1002],
[1003, 1004, 1005]])

第三条规则

在规则1和规则2之后,第三条规则是所有数组的大小必须匹配,如下

try:
k + [33, 44]
except ValueError as e:
print(e)
operands could not be broadcast together with shapes (2,3) (2,)

广播规则用于许多numpy运算,不仅仅是算术运算,下面会介绍。

Upcasting

当尝试组合具有不同数据类型的ndarray时,numpy将向上转换为更通用或精确度更高的数据类型,无论实际值是什么。

k1 = np.arange(0, 5, dtype=np.uint8)
print(k1.dtype, k1)

输出:

uint8 [0 1 2 3 4]
k2 = k1 + np.array([5, 6, 7, 8, 9], dtype=np.int8)
print(k2.dtype, k2)

输出:

int16 [ 5  7  9 11 13]

上面这种情况尽管uint8就足够了,但是需要使用int16来表示所有可能的int8和uint8值(从-128到255)。

k3 = k1 + 1.5
print(k3.dtype, k3)

输出:

float64 [1.5 2.5 3.5 4.5 5.5]

条件运算

条件运算也适用于元素

m = np.array([20, -5, 30, 40])
m < [15, 16, 35, 36]

输出:

array([False,  True,  True, False])
m < 25  # 等同于 m < [25, 25, 25, 25], 应用了广播机制

输出:

array([ True,  True, False, False])

这与布尔索引结合起来使用非常有用。

m[m < 25]

输出:

array([20, -5])

数学和统计函数

许多数学和统计函数也适用于ndarray。

ndarray的方法

一些函数仅仅是ndarray的方法,例如:

a = np.array([[-2.5, 3.1, 7], [10, 11, 12]])
print(a)
print("mean = ", a.mean())

输出:

[[-2.5  3.1  7. ]
[10. 11. 12. ]]
mean = 6.766666666666667

不管ndarray的形状如何,mean()函数将会计算ndarray中所有元素的平均值。

这有一些更实用的ndarray方法

for func in (a.min, a.max, a.sum, a.prod, a.std, a.var):
print(func.__name__, '=', func())

输出:

min = -2.5
max = 12.0
sum = 40.6
prod = -71610.0
std = 5.084835843520964
var = 25.855555555555554

这些函数可以接受一个可选参数axis,该参数允许对给定轴上的元素执行操作。例如:

c = np.arange(24).reshape(2, 3, 4)
c

输出:

array([[[ 0,  1,  2,  3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]], [[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
c.sum(axis=0) # 跨矩阵求和

输出:

array([[12, 14, 16, 18],
[20, 22, 24, 26],
[28, 30, 32, 34]])
c.sum(axis=1)  # 跨行求和

输出:

array([[12, 15, 18, 21],
[48, 51, 54, 57]])
c.sum(axis=2)

输出:

array([[ 6, 22, 38],
[54, 70, 86]])

也可以在多个轴上求和

c.sum(axis=(0, 2))

输出:

array([ 60,  92, 124])

通用函数

numpy还提供了快速的元素级函数,它们被称为通用函数或ufunc。它们是简单函数的矢量化包装。例如,square返回一个新ndarray,它是原始ndarray的副本,但每个元素是原来元素的平方。

a = np.array([[-2.5, 3.1, 7], [10, 11, 12]])
np.square(a)

输出:

array([[  6.25,   9.61,  49.  ],
[100. , 121. , 144. ]])

还有一些更实用的一元通用函数。

print('Original ndarray')
print(a)
for func in (np.abs, np.sqrt, np.exp, np.log, np.sign, np.ceil, np.modf, np.isnan, np.cos):
print('\n', func.__name__)
print(func(a)) # modf: 将ndarray各元素的小数和整数部分以两个独立数组形式返回
# ceil: 向上取整

输出:

Original ndarray
[[-2.5 3.1 7. ]
[10. 11. 12. ]] absolute
[[ 2.5 3.1 7. ]
[10. 11. 12. ]] sqrt
[[ nan 1.76068169 2.64575131]
[3.16227766 3.31662479 3.46410162]] exp
[[8.20849986e-02 2.21979513e+01 1.09663316e+03]
[2.20264658e+04 5.98741417e+04 1.62754791e+05]] log
[[ nan 1.13140211 1.94591015]
[2.30258509 2.39789527 2.48490665]] sign
[[-1. 1. 1.]
[ 1. 1. 1.]] ceil
[[-2. 4. 7.]
[10. 11. 12.]] modf
(array([[-0.5, 0.1, 0. ],
[ 0. , 0. , 0. ]]), array([[-2., 3., 7.],
[10., 11., 12.]])) isnan
[[False False False]
[False False False]] cos
[[-0.80114362 -0.99913515 0.75390225]
[-0.83907153 0.0044257 0.84385396]]

二元通用函数

还有许多二元通用函数,它们在两个ndarray上按元素应用,如果ndarray形状不同,则应用广播规则。

a = np.array([1, -2, 3, 4])
b = np.array([2, 8, -1, 7])
np.add(a, b) # 相当于 a + b

输出:

array([ 3,  6,  2, 11])
np.greater(a, b)   # 相当于 a > b

输出:

array([False, False,  True, False])
np.maximum(a, b)

输出:

array([2, 8, 3, 7])
np.copysign(a, b) # 将b中各元素的符号赋给a的对应元素

输出:

array([ 1.,  2., -3.,  4.])

numpy教程03---ndarray的运算的更多相关文章

  1. numpy教程

    [转]CS231n课程笔记翻译:Python Numpy教程 原文链接:https://zhuanlan.zhihu.com/p/20878530 译者注:本文智能单元首发,翻译自斯坦福CS231n课 ...

  2. 转:Numpy教程

    因为用到theano写函数的时候饱受数据结构困扰 于是上网找了一篇numpy教程(theano的数据类型是基于numpy的) 原文排版更好,阅读体验更佳: http://phddreamer.blog ...

  3. Python 机器学习库 NumPy 教程

    0 Numpy简单介绍 Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy.matplotlib一起使用.其实,list已经提供了类似于矩阵的表示形式,不过numpy ...

  4. Numpy入门(二):Numpy数组索引切片和运算

    在Numpy中建立了数组或者矩阵后,需要访问数组里的成员,改变元素,并对数组进行切分和计算. 索引和切片 Numpy数组的访问模式和python中的list相似,在多维的数组中使用, 进行区分: 在p ...

  5. NumPy 教程目录

    NumPy 教程目录 1 Lesson1--NumPy NumPy 安装 2 Lesson2--NumPy Ndarray 对象 3 Lesson3--NumPy 数据类型 4 Lesson4--Nu ...

  6. [译]Vulkan教程(03)开发环境

    [译]Vulkan教程(03)开发环境 这是我翻译(https://vulkan-tutorial.com)上的Vulkan教程的第3篇. In this chapter we'll set up y ...

  7. numpy教程:矩阵matrix及其运算

    http://blog.csdn.net/pipisorry/article/details/48791403 numpy矩阵简介 NumPy函数库中存在两种不同的数据类型(矩阵matrix和数组ar ...

  8. Numpy数值类型与数值运算-03

    什么是NumPy? NumPy是Python中科学计算的基本软件包.它是一个Python库,提供多维数组对象,各种派生对象(例如蒙版数组和矩阵) 以及各种例程,用于对数组进行快速操作,包括数学,逻辑, ...

  9. 3.4Python数据处理篇之Numpy系列(四)---ndarray 数组的运算

    目录 目录 (一)数组与标量的运算 1.说明: 2.实例: (二)元素级的运算(一元函数) 1.说明: 2.实例: (三)数组级的运算(二元函数) 1.说明: 2.实例: 目录 1.数组与标量的运算 ...

随机推荐

  1. 自己动手写Vector【Cherno C++教程】

    动手写一个Vector 本文是对<最好的C++教程>的动手写数据结构部分的一个整理,主要包含91p动手写Array数组和92p动手写Vector数组的内容. 自己动手来写这些数据结构是学习 ...

  2. itertools.chain()and itertools.product()操作+pandas.DataFrame.transform

  3. MATLAB绘制三角网及三维网线

    今天博主给大家介绍一些比较常见的可视化操作,绘制三角网及三维网线. 三角网是由一系列连续三角形构成的网状的平面控制图形,是三角测量中布设连续三角形的两种主要扩展形式,同时向各方向扩展而构成网状,优点为 ...

  4. jdk配置完成tomcat无法启动问题解决

    今天在进行struts2练习之前,准备为电脑配置tomcat容器,发现jdk的java指令可以正确运行,而tomcat启动时控制台弹出后立即消失.查资料显示jdk为正确配置,但是自己的java指令都能 ...

  5. docker 部署mysql tomcat时 在root@localhost~下——-——docker exec -it 容器名 /bin/bash 报错

    在docker部署mysql时 报错 找不到 容器不自动启动  , docker start 容器名  也没有效果 多次尝试发现 原因是创建容器时在 下面创建的 更改为下创建 问题解决

  6. AQS详解之独占锁模式

    AQS介绍 AbstractQueuedSynchronizer简称AQS,即队列同步器.它是JUC包下面的核心组件,它的主要使用方式是继承,子类通过继承AQS,并实现它的抽象方法来管理同步状态,它分 ...

  7. javaweb项目中关于配置文件web.xml的解析

    一..启动tomcat,加载项目中的web.xml文件,创建servercontext上下文对象. 可以通过servercontext对象在应用中获取web.xml文件中的值. web应用加载的顺序与 ...

  8. Python 的排序方法 sort 和 sorted 的区别

    使用 sort() 或内建函数 sorted() 对列表进行排序.它们之间的区别有两点: sort() 方法是对原列表进行操作,而 sorted() 方法会返回一个新列表,不是在原来的基础上进行操作. ...

  9. 记一次Prometheus代理性能优化问题

    最近有做一个Prometheus metrics代理的一个小项目,暂称为prom-proxy,目的是为了解析特定的指标(如容器.traefik.istio等指标),然后在原始指标中加入应用ID(当然还 ...

  10. 女朋友汇总表格弄了大半天,我实在看不下去了,用40行代码解决问题 | Python使用openpyxl库读写表格Excel(xlsx)

    1.openpyxl基本操作 python程序从excel文件中读数据基本遵循以下步骤: 1.import openpyxl 2.调用openpyxl模块下的load_workbook('你的文件名. ...