|
|
|
|
|
# 2.1.3:基础操作
|
|
|
|
|
|
## 算术运算
|
|
|
|
|
|
如果想要对 ndarray 对象中的元素做 elementwise (**逐个元素地**)的算术运算非常简单,加减乘除即可。代码如下:
|
|
|
|
|
|
```python
|
|
|
import numpy as np
|
|
|
|
|
|
a = np.array([0, 1, 2, 3])
|
|
|
|
|
|
# a中的所有元素都加2,结果为[2, 3, 4, 5]
|
|
|
b = a + 2
|
|
|
|
|
|
# a中的所有元素都减2,结果为[-2, -1, 0, 1]
|
|
|
c = a - 2
|
|
|
|
|
|
# a中的所有元素都乘以2,结果为[0, 2, 4, 6]
|
|
|
d = a * 2
|
|
|
|
|
|
# a中的所有元素都平方,结果为[0, 1, 4, 9]
|
|
|
e = a ** 2
|
|
|
|
|
|
# a中的所有元素都除以2,结果为[0, 0.5, 1, 1.5]
|
|
|
f = a / 2
|
|
|
|
|
|
# a中的所有元素都与2比,结果为[True, True, False, False]
|
|
|
g = a < 2
|
|
|
|
|
|
```
|
|
|
|
|
|
## 矩阵运算
|
|
|
|
|
|
相同 shape 的矩阵 A 与矩阵 B 之间想要做 elementwise 运算也很简单,加减乘除即可。代码如下:
|
|
|
|
|
|
```python
|
|
|
import numpy as np
|
|
|
|
|
|
a = np.array([[0, 1], [2, 3]])
|
|
|
b = np.array([[1, 1], [3, 2]])
|
|
|
|
|
|
# a与b逐个元素相加,结果为[[1, 2], [5, 5]]
|
|
|
c = a + b
|
|
|
|
|
|
# a与b逐个元素相减,结果为[[-1, 0], [-1, 1]]
|
|
|
d = a - b
|
|
|
|
|
|
# a与b逐个元素相乘,结果为[[0, 1], [6, 6]]
|
|
|
e = a * b
|
|
|
|
|
|
# a的逐个元素除以b的逐个元素,结果为[[0., 1.], [0.66666667, 1.5]]
|
|
|
f = a / b
|
|
|
|
|
|
# a与b逐个元素做幂运算,结果为[[0, 1], [8, 9]]
|
|
|
g = a ** b
|
|
|
|
|
|
# a与b逐个元素相比较,结果为[[True, False], [True, False]]
|
|
|
h = a < b
|
|
|
|
|
|
```
|
|
|
|
|
|
细心的同学应该发现了, * 只能做 elementwise 运算,如果想做真正的矩阵乘法运算显然不能用 * 。 NumPy 提供了 @ 和 dot 函数来实现矩阵乘法。代码如下:
|
|
|
|
|
|
```python
|
|
|
import numpy as np
|
|
|
|
|
|
A = np.array([[1, 1], [0, 1]])
|
|
|
B = np.array([[2, 0], [3, 4]])
|
|
|
|
|
|
# @表示矩阵乘法,矩阵A乘以矩阵B,结果为[[5, 4], [3, 4]]
|
|
|
print(A @ B)
|
|
|
|
|
|
# 面向对象风格,矩阵A乘以矩阵B,结果为[[5, 4], [3, 4]]
|
|
|
print(A.dot(B))
|
|
|
|
|
|
# 面向过程风格,矩阵A乘以矩阵B,结果为[[5, 4], [3, 4]]
|
|
|
print(np.dot(A, B))
|
|
|
```
|
|
|
|
|
|
输出如下:
|
|
|
|
|
|
```python
|
|
|
[[5 4]
|
|
|
[3 4]]
|
|
|
[[5 4]
|
|
|
[3 4]]
|
|
|
[[5 4]
|
|
|
[3 4]]
|
|
|
```
|
|
|
|
|
|
## 简单统计
|
|
|
|
|
|
有的时候想要知道 ndarray 对象中元素的和是多少,最小值是多少,最小值在什么位置,最大值是多少,最大值在什么位置等信息。这个时候可能会想着写一个循环去遍历 ndarray 对象中的所有元素来进行统计。 NumPy 为了解放我们的双手,提供了 sum , min ,max ,argmin ,argmax 等函数来实现简单的统计功能,代码如下:
|
|
|
|
|
|
```python
|
|
|
import numpy as np
|
|
|
|
|
|
a = np.array([[-1, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 13]])
|
|
|
|
|
|
# 计算a中所有元素的和,结果为67
|
|
|
print(a.sum())
|
|
|
|
|
|
# 找出a中最大的元素,结果为13
|
|
|
print(a.max())
|
|
|
|
|
|
# 找出a中最小的元素,结果为-1
|
|
|
print(a.min())
|
|
|
|
|
|
# 找出a中最大元素在a中的位置,由于a中有12个元素,位置从0开始计,所以结果为11
|
|
|
print(a.argmax())
|
|
|
|
|
|
# 找出a中最小元素在a中位置,结果为0
|
|
|
print(a.argmin())
|
|
|
|
|
|
```
|
|
|
|
|
|
输出如下:
|
|
|
|
|
|
```python
|
|
|
67
|
|
|
13
|
|
|
-1
|
|
|
11
|
|
|
0
|
|
|
```
|
|
|
|
|
|
有的时候,我们在统计时需要根据轴来统计。举个例子,公司员工的基本工资,绩效工资,年终奖的信息如下:
|
|
|
|
|
|
| 工号 | 基本工资 | 绩效工资 | 年终奖 |
|
|
|
| ------------ | ------------ | ------------ | ------------ |
|
|
|
| 1 | 3000 | 4000 | 20000 |
|
|
|
| 2 | 2700 | 5500 | 25000 |
|
|
|
| 3 | 2800 | 3000 | 15000 |
|
|
|
|
|
|
这样一个表格很明显,可以用 ndarray 来存储。代码如下:
|
|
|
|
|
|
```python
|
|
|
import numpy as np
|
|
|
|
|
|
info = np.array([[3000, 4000, 20000], [2700, 5500, 25000], [2800, 3000, 15000]])
|
|
|
|
|
|
```
|
|
|
|
|
|
info 实例化之后就有了维度和轴的概念,很明显 info 是个二维数组,所以它的**维度是 2 **。维度为 2 换句话来说就是 info 有**两个轴:0 号轴与 1 号轴(轴的编号从 0 开始算)**。轴所指的方向如下图所示:
|
|
|
|
|
|

|
|
|
|
|
|
如果想要统计下这 3 位员工中基本工资、绩效工资与年终奖的最小值与最大值(**也就是说分别统计出每一列中的最小与最大值**)。我们可以沿着 0 号轴来统计。想要实现沿着哪个轴来统计,只需要修改 axis 即可,代码如下:
|
|
|
|
|
|
```python
|
|
|
import numpy as np
|
|
|
|
|
|
info = np.array([[3000, 4000, 20000], [2700, 5500, 25000], [2800, 3000, 15000]])
|
|
|
|
|
|
# 沿着0号轴统计,结果为[2700, 3000, 15000]
|
|
|
print(info.min(axis=0))
|
|
|
|
|
|
# 沿着0号轴统计,结果为[3000, 5500, 25000]
|
|
|
print(info.max(axis=0))
|
|
|
```
|
|
|
|
|
|
输出如下:
|
|
|
|
|
|
```python
|
|
|
[ 2700 3000 15000]
|
|
|
[ 3000 5500 25000]
|
|
|
```
|
|
|
|
|
|
**PS:当没有修改 axis 时,axis 的值默认为 None 。意思是在统计时会把 ndarray 对象中所有的元素都考虑在内。**
|