文章目录
1 概述
1.1 numpy 简介
- numpy:Numerical Python(数值表示的 Python),支持大量的维度数组与矩阵运算,此外也提供了大量的数学函数库。
- 底层算法:使用了 C 语言,所以运算速度快。
安装 numpy:(第三方库)
pip install numpy
示例:
import numpy as np
a = np.array([1, 2, 3])
print(a) # [1 2 3]
# 返回值类型 ndarray
print(type(a)) # <class 'numpy.ndarray'>
1.2 ndarray 简介
ndarray 主要有以下特点
- 元素索引:元素下标从 0 开始。
- 元素类型:元素类型完全相同。(若元素类型不同,按优先级
str > float > int
自动转换) - 内存空间:元素所占内存空间一样大。
import numpy as np
# 示例:一维数组
a = np.array([1, 2, 3])
# 元素索引:从 0 开始
print(f'下标为 0 的元素:{a[0]}') # 1
print(f'下标为 1 的元素:{a[1]}') # 2
print(f'下标为 2 的元素:{a[2]}') # 3
# 元素类型:完全一样
print(f'下标为 0 的元素类型:{a[0].dtype}') # int32
print(f'下标为 1 的元素类型:{a[1].dtype}') # int32
print(f'下标为 2 的元素类型:{a[2].dtype}') # int32
# 元素内存空间:完全一样
print(f'下标为 0 的元素内存空间:{a[0].itemsize}') # 4
print(f'下标为 1 的元素内存空间:{a[1].itemsize}') # 4
print(f'下标为 2 的元素内存空间:{a[2].itemsize}') # 4
元素类型转换示例:
import numpy as np
# 示例:一维数组
# 1 和 2 是 int, 3.5 是 float
a = np.array([1, 2, 3.5])
print(a) # [1. 2. 3.5]
print(f'下标为 0 的元素类型:{a[0].dtype}') # float64
print(f'下标为 1 的元素类型:{a[1].dtype}') # float64
print(f'下标为 2 的元素类型:{a[2].dtype}') # float64
2 数组操作
2.1 创建数组:array()
语法格式:
numpy.array(object, # 数组的输入数据。可以是列表、元组、数组等
dtype=None, # 生成数组的数据类型
copy=True, # 是否复制
order=None, # 是否排序(内存,C:按行方向,F:按列方向,A:任意方向,k:默认数据输入时方向)
subok=False, # 是否返回子类数组
ndmin=0 # 生成数组的维度
)
# 重点关注:dtype、ndmin
# copy、order、subok 了解即可,与内存存储相关,一般不使用
import numpy as np
# 创建一维数组
a = np.array([1, 2, 3])
print(a)
# 创建二维数组
b = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(b)
# 创建结构化数据的数组
student = np.dtype([('name', 'S10'), ('age', 'i1'), ('sex', 'f4')])
c = np.array([('张三', 21, '女'), ('李四', 18, '男')])
print(c)
# [['张三' '21' '女']
# ['李四' '18' '男']]
# 其它内置创建数组的函数,此处仅举例部分
# 示例:创建给定数组范围的数组:arange()
d = np.arange(start=1, # 起点(默认 0)
stop=5, # 终点(不包含)
step=1, # 步长(默认 1)
dtype=np.int_ # 返回数据的类类型(自动判断)
)
print(d) # [1 2 3 4]
2.2 裁切数组:切片
- 同字符串的 切片
[start: end: step]
- start:起点索引,包含
- end:终点索引,不包含,默认所有
- step:步长,默认 1
import numpy as np
# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5])
# 裁切 索引1 到 索引4 的元素,步长为 1
print(a[1:4:1]) # [2 3 4]
# 裁切 索引1 到 结尾的元素,步长为 2
print(a[1::2]) # [2 4]
# 示例2:二维数组
b = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 裁切 横索引1、纵索引1:3 的元素
print(b[1, 1:3]) # [5 6]
2.3 拼接数组:concatenate()
import numpy as np
# 示例1:连接一维数组
a1 = np.array([1, 2, 3])
a2 = np.array([4, 5, 6])
a = np.concatenate((a1, a2))
print(a) # [1 2 3 4 5 6]
# 示例2:沿着对称轴(axis=1)连接二维数组
b1 = np.array([[1, 2],
[3, 4]])
b2 = np.array([[5, 6],
[7, 8]])
print(np.concatenate((b1, b2), axis=1))
# [[1 2 5 6]
# [3 4 7 8]]
2.4 拆分数组:array_split()
import numpy as np
# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5, 6])
new_a = np.array_split(a, 3)
print(new_a)
# [array([1, 2]), array([3, 4]), array([5, 6])]
# 示例2:二维数组
b = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
new_b = np.array_split(b, 2)
print(new_b)
# [array([[1, 2, 3],
# [4, 5, 6]]), array([[7, 8, 9]])]
print(np.array_split(b, 2, axis=1)) # 沿对称轴拆分
# [array([[1, 2],
# [4, 5],
# [7, 8]]), array([[3],
# [6],
# [9]])]
2.5 改变数组形状:reshape()
import numpy as np
a = np.arange(12)
print(a)
# [ 0 1 2 3 4 5 6 7 8 9 10 11]
# 示例:由原 一维数组 变为 二维数组(3行4列)
b = a.reshape((3, 4))
print(b)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
3 元素操作
3.1 获取元素:通过索引
import numpy as np
# 一维数组
a = np.array([1, 2, 3])
print(f'获取下标索引为 0 的元素:{a[0]}') # 1
print(f'获取下标索引为 1 的元素:{a[1]}') # 2
print(f'获取下标索引为 2 的元素:{a[2]}') # 4
# 二维数组
b = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(f'获取下标索引为 0,0 的元素:{b[0][0]}') # 1。写法1
print(f'获取下标索引为 1,0 的元素:{b[1, 0]}') # 4。写法2
3.2 获取元素:通过迭代器 nditer()
import numpy as np
# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5, 6])
for x in np.nditer(a):
print(x, end=", ") # 1, 2, 3, 4, 5, 6,
print()
# 示例2:二维数组
b = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
for x in np.nditer(b):
print(x, end=", ") # 1, 2, 3, 4, 5, 6, 7, 8, 9,
3.3 获取元素及索引:ndenumerate()
import numpy as np
# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5, 6])
for idx, x in np.ndenumerate(a):
print(idx, x, end=", ")
# (0,) 1, (1,) 2, (2,) 3, (3,) 4, (4,) 5, (5,) 6,
print()
# 示例2:二维数组
b = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
for idx, x in np.ndenumerate(b):
print(idx, x, end=", ")
# (0, 0) 1, (0, 1) 2, (0, 2) 3,
# (1, 0) 4, (1, 1) 5, (1, 2) 6,
# (2, 0) 7, (2, 1) 8, (2, 2) 9,
3.4 搜索元素:where()
import numpy as np
a = np.array([0, 1, 2, 3, 3, 5])
x = np.where(a == 3)
print(f'出现元素 3 的索引:{x}') # (array([3, 4], dtype=int32),)
print(f'元素值为偶数的索引;{np.where(a%2 == 0)}') # (array([0, 2], dtype=int32),)
3.5 元素排序:sort()
import numpy as np
a = np.array([0, 1, 2, 4, 3, 5])
b = np.sort(a) # b 是 a 的副本,不影响 a 的元素
print(b) # [0 1 2 3 4 5]
3.6 元素过滤:过滤器
import numpy as np
a = np.array([0, 1, 2, 4, 3, 5])
# 过滤器:仅保留 >= 3 的元素
filter_a = a >= 3
new_a = a[filter_a]
print(new_a) # [4 3 5]
3.7 行列互换:transponse()
import numpy as np
a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
b = np.transpose(a)
print(b)
# [[ 0 4 8]
# [ 1 5 9]
# [ 2 6 10]
# [ 3 7 11]]
# 利用属性,效果同上
c = a.T
print(c)
4 扩展
4.1 元素类型:dtype
类型 | 字符代码 | 描述 |
---|---|---|
bool_ | b | 布尔型(True、False) |
int_ | i | 整数(默认,类似 C 语言中的 long、int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int64 | |
intp | 用于索引的整数(类似 C 语言中的 ssize_t,一般是 int32 或 int64) | |
int8 | i1 | 字节数( − 2 7 -2^7 −27 to 2 7 − 1 2^7-1 27−1) |
int16 | i2 | 字节数( − 2 15 -2^{15} −215 to 2 15 − 1 2^{15}-1 215−1) |
int32 | i4 | 字节数( − 2 31 -2^{31} −231 to 2 31 − 1 2^{31}-1 231−1) |
int64 | i8 | 字节数( − 2 63 -2^{63} −263 to 2 63 − 1 2^{63}-1 263−1) |
uint8 | u1 | 无符号整数( 0 0 0 to 2 8 − 1 2^{8}-1 28−1) |
uint16 | u2 | 无符号整数( 0 0 0 to 2 16 − 1 2^{16}-1 216−1) |
uint32 | u4 | 无符号整数( 0 0 0 to 2 32 − 1 2^{32}-1 232−1) |
uint64 | u8 | 无符号整数( 0 0 0 to 2 64 − 1 2^{64}-1 264−1) |
float_ | float64 类型的简写 | |
float16 | f2 | 半精度浮点数。1个符号位,5个指数位,10个尾数位 |
float32 | f4 | 单精度浮点数。1个符号位,8个指数位,23个尾数位 |
float64 | f8 | 双精度浮点数。1个符号位,11个指数位,52个尾数位 |
complex_ | complex 128 类型的简写 | |
complex64 | c8 | 复数,表示双 32 位浮点数 |
complex128 | c16 | 复数,表示双 64 位浮点数 |
string_ | S | 固定长度字符串,如:S10,长度为 10 |
object | O | Python 对象类型 |
4.2 数组属性
import numpy as np
a = np.array([1, 2, 3])
print(a) # [1 2 3]
print(f'维度数量 ndim={a.ndim}')
print(f'元素总数 size={a.size}')
print(f'元素形状 shape={a.shape}') # 行 * 列 = 总数
print(f'元素类型 dtype={a.dtype}')
print(f'元素大小 itemsize={a.itemsize}') # 单位:字节
print(f'内存标志 flags={a.flags}')
print(f'元素实部 real={a.real}')
print(f'元素虚部 imag={a.imag}')
print(f'元素缓冲 data={a.data}')