python array中元素出现的次数_数组


不用 Python 非好汉,不晓 NumPy 真遗憾


# 导入 NumPy, 开始学习
import numpy as np



NumPy 是 Numerical Python 的简称,它是目前 Python 数值计算


0 NDArray —— 多维数组对象


python array中元素出现的次数_array用法 numpy_02

多维数组对象

NDArray( N-dimensional array )是学习 NumPy 的基础:

  • 快速 灵活 大数据集容器
  • 存储 变化 数据 主要工具

它有多快,它有多灵活?

且听我慢慢道来。


1 生成 NDArray

首先,我们可以使用 np.array()


python array中元素出现的次数_array用法 numpy_03


也可使用以下的方法,我们只需将生成元素的数量传给它们:


python array中元素出现的次数_Python_04


你看这个数组,它又方又正,

我们需要一些属性去描述它。

这里有三个属性 np.ndim 、np.shape 和 np.dtype :

  • np.ndim :描述数组的 维度,dimension 维度
  • np.shape :表征数组每一维度的 数量
  • np.dtype :描述数组的 数据类型

我们以 np.zeros()


python array中元素出现的次数_Python_05


  • shape : 整数 整数元组 ,例如 3 或 (2,3)
  • dtype : 默认为 np.float64
  • order

np.shape 传递参数,我们就能创建 多维数组


python array中元素出现的次数_array用法 numpy_06


python array中元素出现的次数_array用法 numpy_07


python array中元素出现的次数_array用法 numpy_08

图解 np.shape

这里补充一下, np.reshape()


python array中元素出现的次数_Python_09

图解 np.reshape()

下面是常用的 数组生成函数


python array中元素出现的次数_NumPy_10

数组生成函数

创建数组后,就可以开始以有趣的方式操作它们了。


1.2 NDArray 的数据类型

等等刹个车,

某些应用场景下,我们还需要考虑数组的 数据类型 :

  • np.dtype查看 数组 数据类型
  • np.astype()修改 数组 数据类型


python array中元素出现的次数_Python_11


下面是常用的 NumPy 数据类型


python array中元素出现的次数_array用法 numpy_12

NumPy 数据类型

我们还可以将 数字字符串 转换为 数字


python array中元素出现的次数_array用法 numpy_13

数字字符串 → 数字

好了,终于可以开始有趣的操作数组了。


1.3 NumPy 数组运算

讲重点了,

数组之所以 重要 是因为它允许你进行 批量操作 而无须任何 for 循环。

这种特性被称为 向量化

  • 任何在 两个等尺寸数组 之间的算术操作都应用了 逐元素操作

让我们创建两个 NumPy 数组来展示它们的用途:


python array中元素出现的次数_array用法 numpy_14


向量化 加减乘除


python array中元素出现的次数_数组_15


python array中元素出现的次数_array用法 numpy_16


当然也可以进行 标量


python array中元素出现的次数_array用法 numpy_17


Python 的 for 循环慢的可怕,用 向量化 计算可以快百倍


1.4 基础索引与切片


python array中元素出现的次数_数组_18

一维数组 索引与切片

python array中元素出现的次数_Python_19

二维数组 索引与切片

值得强调的是 切片左闭右开,这是个坑,

里面躺在很多人,包括我。

这里有两个概念需要说明:

  • 副本拷贝,物理内存不在同一位置
  • 视图引用,物理内存在同一位置

显然 视图 更节约内存空间

那什么时候是“副本”,什么时候是“视图”呢?

答:

Python 序列切片 属于 副本

Numpy np.array切片 属于 视图

如果想要一份 数组切片的拷贝 而不是视图的话,就必须 显式地复制 这个数组,例如 data[1:3].copy()


1.5 布尔索引

数组比较操作(比如 ==)也是可以 向量化

我们先创建两个数组,

一个代表姓名(name),

一个代表对应的成绩(score):


python array中元素出现的次数_NumPy_20


进行 布尔索引

查看 Yellow 的成绩:


python array中元素出现的次数_Python_21

Yellow 不错呀

看看谁没有及格:


python array中元素出现的次数_Python_22

原来是 Wangcai 呀

看看不及格成绩:


python array中元素出现的次数_NumPy_23

可怜的 Wangcai

这里需要强调的是 布尔索引 总是生成数据的 拷贝


1.6 神奇索引

神奇索引,一个 magical 的名字,

它是 Numpy 中的术语,用于描述使用 整数数组


python array中元素出现的次数_array用法 numpy_24


神奇索引的结果总是 一维

神奇索引在赋值时,有妙用。

这里需要强调的是 神奇索引 也总是生成数据的 拷贝


1.7 数组转置和换轴

转置 np.T


python array中元素出现的次数_数组_25


换轴 np.transpose() :

  • 接受包含轴编号的元组,用于置换轴

二维数组 置换轴


python array中元素出现的次数_NumPy_26

二维数组置换轴

看到这里,会想这个有什么用呢,不是转置吗?

如果有这个疑问,可以看看下面三维的使用。

三维数组 置换轴

可以看我下面这个回答,就对三维数组巧妙地使用了 np.transpose(),实现了 图像信号信道分离 信道重组

一副图像,是(3,566,800)这种形式,如何变成(566,800,3)这样形式?www.zhihu.com

python array中元素出现的次数_Python_27

本文参考:

名称:A Visual Intro to NumPy and Data Representation 作者:Jay Alammar

名称:Python for Data Analysis 作者:Wes McKinney