You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
4.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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 开始算)**。轴所指的方向如下图所示:
![轴示意图](1.jpg)
如果想要统计下这 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 对象中所有的元素都考虑在内。**