Numpy是一个功能强大的Python库,允许更高级的数据操作和数学计算。
基础篇
理解 NumPy
Numpy是一个功能强大的Python库,允许更高级的数据操作和数学计算。
什么是 NumPy?
NumPy来源于两个单词 Numerical
和Python
,是一个功能强大的Python库,主要用于对多维数组执行计算。
NumPy 的安装
pip install numpy
NumPy 中的数组
NumPy提供的最重要的数据结构是一个称为NumPy数组的强大对象。NumPy数组是通常的Python数组的扩展。NumPy数组配备了大量的函数和运算符,可以帮助我们快速编写各种类型计算的高性能代码。
一维Numpy数组定义
1 | >>> import numpy as np |
创建指定个数元素为0的数组(np.zeros)
1 | import numpy as np |
创建指定个数元素为1的数组(np.ones)
1 | import numpy as np |
创建指定个数元素为n的数组(np.full)
1 | import numpy as np |
创建单位矩阵(np.eye)
1 | 5) np.eye( |
NumPy中的数组操作
使用NumPy,你可以轻松地在数组上执行数学运算。例如,你可以添加NumPy数组,你可以减去它们,你可以将它们相乘,甚至可以将它们分开。 以下是一些例子:
1 | import numpy as np |
如你所见,乘法运算符执行逐元素乘法而不是矩阵乘法。 要执行矩阵乘法,你可以执行以下操作:
1 | matrix_product = a.dot(b) |
输出将是:
1 | [[19. 22.] |
NumPy 简单入门教程
数组基础
创建一个数组
1 | # 1D Array |
1 | # MD Array, |
多维数组切片
1 | # MD slicing |
数组属性
1 | # Array properties |
使用数组
基本操作符
1 | # Basic Operators |
除了 dot() 之外,这些操作符都是对数组进行逐元素运算。比如 (a, b, c) + (d, e, f) 的结果就是 (a+d, b+e, c+f)。它将分别对每一个元素进行配对,然后对它们进行运算。它返回的结果是一个数组。注意,当使用逻辑运算符比如 “<” 和 “>” 的时候,返回的将是一个布尔型数组。
dot() 函数计算两个数组的点积。它返回的是一个标量(只有大小没有方向的一个值)而不是数组。
数组特殊运算符
1 | # dot, sum, min, max, cumsum |
索引进阶
花式索引(Fancy indexing)
1 | # Fancy indexing |
布尔屏蔽(Boolean masking)
布尔屏蔽是一个有用的功能,它允许我们根据我们指定的条件检索数组中的元素
1 | # Boolean masking |
位运算符:
& | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | (a & b) 输出结果 12 ,二进制解释: 0000 1100 |
---|---|---|
| | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 | (a | b) 输出结果 61 ,二进制解释: 0011 1101 |
^ | 按位异或运算符:当两对应的二进位相异时,结果为1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1 | (~a ) 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。 | a << 2 输出结果 240 ,二进制解释: 1111 0000 |
>> | 右移动运算符:把”>>”左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数 | a >> 2 输出结果 15 ,二进制解释: 0000 1111 |
缺省索引(Incomplete Indexing)
1 | # Incomplete Indexing |
Where 函数
1 | # Where |
Python、Numpy 教程
数组(Arrays)
numpy数组是一个值网格,所有类型都相同,并由非负整数元组索引。
维数是数组的排名;
数组的形状是一个整数元组,给出了每个维度的数组大小。
Numpy还提供了许多创建数组的函数
1 | import numpy as np |
数组索引
切片(Slicing)
与Python列表类似,可以对numpy数组进行切片。由于数组可能是多维的,因此必须为数组的每个维指定一个切片
1 | import numpy as np |
整数数组索引
使用切片索引到numpy数组时,生成的数组视图将始终是原始数组的子数组。 相反,整数数组索引允许你使用另一个数组中的数据构造任意数组
1 | import numpy as np |
整数数组索引的一个有用技巧是从矩阵的每一行中选择或改变一个元素
1 | import numpy as np |
布尔数组索引
布尔数组索引允许你选择数组的任意元素。通常,这种类型的索引用于选择满足某些条件的数组元素。
1 | import numpy as np |
数组中的数学
基本数学函数在数组上以元素方式运行,既可以作为运算符重载,也可以作为numpy模块中的函数
1 | import numpy as np |
Numpy为在数组上执行计算提供了许多有用的函数;其中最有用的函数之一是 SUM
:
1 | import numpy as np |
你可以在这篇文档中找到numpy提供的数学函数的完整列表。
除了使用数组计算数学函数外,我们经常需要对数组中的数据进行整形或其他操作。这种操作的最简单的例子是转置一个矩阵;要转置一个矩阵,只需使用一个数组对象的T
属性:
1 | import numpy as np |
广播(Broadcasting)
广播是一种强大的机制,它允许numpy在执行算术运算时使用不同形状的数组。通常,我们有一个较小的数组和一个较大的数组,我们希望多次使用较小的数组来对较大的数组执行一些操作
例如,假设我们要向矩阵的每一行添加一个常数向量。我们可以这样做:
1 | import numpy as np |
这会凑效; 但是当矩阵 x
非常大时,在Python中计算显式循环可能会很慢。注意,向矩阵 x
的每一行添加向量 v
等同于通过垂直堆叠多个 v
副本来形成矩阵 vv
,然后执行元素的求和x
和 vv
。 我们可以像如下这样实现这种方法:
1 | import numpy as np |
Numpy广播允许我们在不实际创建v
的多个副本的情况下执行此计算。考虑这个需求,使用广播如下:
1 | import numpy as np |
y=x+v
行即使x
具有形状(4,3)
和v
具有形状(3,)
,但由于广播的关系,该行的工作方式就好像v
实际上具有形状(4,3)
,其中每一行都是v
的副本,并且求和是按元素执行的。
将两个数组一起广播遵循以下规则:
- 如果数组不具有相同的rank,则将较低等级数组的形状添加1,直到两个形状具有相同的长度。
- 如果两个数组在维度上具有相同的大小,或者如果其中一个数组在该维度中的大小为1,则称这两个数组在维度上是兼容的。
- 如果数组在所有维度上兼容,则可以一起广播。
- 广播之后,每个数组的行为就好像它的形状等于两个输入数组的形状的元素最大值。
- 在一个数组的大小为1且另一个数组的大小大于1的任何维度中,第一个数组的行为就像沿着该维度复制一样
创建 Numpy 数组的不同方式
创建Numpy数组有三种不同的方法:
- 使用Numpy内部功能函数
- 从列表等其他Python的结构进行转换
- 使用特殊的库函数
使用Numpy内部功能函数
Numpy具有用于创建数组的内置函数。
创建一个一维的数组
1 | import Numpy as np |
创建一个二维数组
1 | import Numpy as np |
创建三维数组及更多维度
1 | import Numpy as np |
创建一个填充零的数组
1 | import numpy as np |
创建一个填充1的数组
1 | import numpy as np |
创建一个空的数组
它的初始内容是随机的,取决于内存的状态
1 | import numpy as np |
创建一个填充给定值的数组
1 | import numpy as np |
创建一个单位矩阵
1 | import numpy as np |
创建指定的时间间隔的数组
1 | import numpy as np |
从Python列表转换
1 | import numpy as np |
使用特殊的库函数
1 | import numpy as np |
进阶篇
NumPy数据分析问答
导入numpy作为np,并查看版本
1 | import numpy as np |
如何创建一维数组
1 | arr = np.arange(10) |
如何创建一个布尔数组
1 | # 创建一个numpy数组元素值全为True(真)的数组 |
如何从一维数组中提取满足指定条件的元素?
1 | # 从 arr 中提取所有的奇数 |
如何用numpy数组中的另一个值替换满足条件的元素项?
1 | # 将arr中的所有奇数替换为-1 |
如何在不影响原始数组的情况下替换满足条件的元素项?
1 | # 将arr中的所有奇数替换为-1,而不改变arr |
如何改变数组的形状?
1 | # 将一维数组转换为2行的2维数组 |
如何垂直叠加两个数组?
1 | # 垂直堆叠数组a和数组b |
如何水平叠加两个数组?
1 | # 将数组a和数组b水平堆叠 |
如何在无硬编码的情况下生成numpy中的自定义序列?
1 | # 创建以下模式而不使用硬编码。只使用numpy函数和下面的输入数组a。 |
如何获取两个numpy数组之间的公共项?
1 | # 获取数组a和数组b之间的公共项。 |
如何从一个数组中删除存在于另一个数组中的项?
1 | # 从数组a中删除数组b中的所有项 |
如何得到两个数组元素匹配的位置?
1 | # 获取a和b元素匹配的位置。 |
如何从numpy数组中提取给定范围内的所有数字?
1 | # 获取5到10之间的所有项目。 |
如何创建一个python函数来处理scalars并在numpy数组上工作?
1 | # 转换适用于两个标量的函数maxx,以处理两个数组。 |
如何交换二维numpy数组中的两列?
1 | # 在数组arr中交换列1和2。 |
如何交换二维numpy数组中的两行?
1 | # 交换数组arr中的第1和第2行 |
如何反转二维数组的行?
1 | # 反转二维数组arr的行。 |
如何反转二维数组的列
1 | # 反转二维数组arr的列 |
如何创建包含5到10之间随机浮动的二维数组?
1 | # 创建一个形状为5x3的二维数组,以包含5到10之间的随机十进制数。 |
如何在numpy数组中只打印小数点后三位?
只打印或显示numpy数组rand_arr的小数点后3位。
给定:
1 | rand_arr = np.random.random((5,3)) |
答案:
1 | # Input |
如何通过e式科学记数法(如1e10)来打印一个numpy数组?
问题:通过e式科学记数法来打印rand_arr(如1e10)
给定:
1 | # Create the random array |
期望的输出:
1 | # > array([[ 0.000543, 0.000278, 0.000425], |
答案:
1 | # Reset printoptions to default |