目录
一、numpy库简介
numpy是一个开源的python科学计算基础库,提供了以下功能:
1. 一个强大的N维数组对象:ndarray。
2. 广播功能函数。
3. 整合C/C++/Fortran代码的工具。
4. 线性代数、傅里叶变换、随机数生成等功能。
二、N维数组对象ndarray介绍
1. 小例子
eg: 计算一个列表中每个元素的平方:
# 不使用numpy数组的做法
a = [0, 1, 2, 3, 4]
b = []
for i in range(len(a)):
b.append(a[i] ** 2)
print('不使用numpy数组的做法:', b)
# 使用numpy数组的做法
import numpy as np
a = [0, 1, 2, 3, 4]
a = np.array(a)
b = a ** 2
print('使用numpy数组的做法:', b)
输出结果如下:
不使用numpy数组的做法: [0, 1, 4, 9, 16]
使用numpy数组的做法: [ 0 1 4 9 16]
2. ndarray对象的属性
属性 | 含义 |
.ndim | 秩(即轴的数量) |
.shape | 尺度(如是矩阵,则为n行m列) |
.size | 对象元素个数 |
.dtype | 元素类型 |
.itemsize | 每个元素的大小(以字节为单位) |
示例:
# ndarray对象的属性
import numpy as np
print('生成一个二维数组:')
a = np.array([[0, 1, 2], [3, 4, 5]])
print(a)
print('秩:', a.ndim)
print('尺度:', a.shape)
print('对象元素个数:', a.size)
print('元素类型:', a.dtype)
print('每个元素的大小:', a.itemsize)
输出结果如下:
[[0 1 2]
[3 4 5]]
秩: 2
尺度: (2, 3)
对象元素个数: 6
元素类型: int32
每个元素的大小: 4
3. ndarray数组的创建方法
(1)通过列表、元组创建
a = np.array([0, 1, 2])
print('通过列表创建:', a)
b = np.array((3, 4, 5))
print('通过原则创建:', b)
输出结果如下:
通过列表创建: [0 1 2]
通过原则创建: [3 4 5]
(2)通过numpy中的函数创建
函数 | 作用 |
np.arange(n) | 生成从0到n-1的数组 |
np.ones(shape) | 根据shape生成一个元素全为1的数组 |
np.zeros(shape) | 根据shape生成一个元素全为0的数组 |
np.full(shape, values) | 根据shape生成一个元素全为values的数组 |
np.ones_like(a) | 根据数组a的形状生成一个元素全为0的数组 |
np.zeros_like(a) | 根据数组a的形状生成一个元素全为1的数组 |
np.full_like(a, values) | 根据数组a的形状生成一个元素全为values的数组 |
np.eye(n) | 生成n阶单位矩阵 |
np.linspace(a, b, number) | 从a到b等间距地生成number个数据,形成数组 |
np.concatenate((a, b), axis=0) | 按0轴方向合并a,b数组 |
a = np.arange(6)
print('a\n',a)
b = np.ones((2, 3))
print('b\n',b)
c = np.zeros((2, 3))
print('c\n',c)
d = np.full((2, 3), 9)
print('d\n',d)
e = np.ones_like(b)
print('e\n',e)
f = np.zeros_like(b)
print('f\n',f)
g = np.full_like(b, 9)
print('g\n',g)
h = np.eye(6)
print('h\n',h)
i = np.linspace(1, 10, 6)
print('i\n',i)
j = np.concatenate((d, e, f), axis=1)
print('j\n',j)
k = np.concatenate((d, e, f)) # 默认axis=0
print('k\n', k)
输出结果如下:
a
[0 1 2 3 4 5]
b
[[1. 1. 1.]
[1. 1. 1.]]
c
[[0. 0. 0.]
[0. 0. 0.]]
d
[[9 9 9]
[9 9 9]]
e
[[1. 1. 1.]
[1. 1. 1.]]
f
[[0. 0. 0.]
[0. 0. 0.]]
g
[[9. 9. 9.]
[9. 9. 9.]]
h
[[1. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0.]
[0. 0. 0. 1. 0. 0.]
[0. 0. 0. 0. 1. 0.]
[0. 0. 0. 0. 0. 1.]]
i
[ 1. 2.8 4.6 6.4 8.2 10. ]
j
[[9. 9. 9. 1. 1. 1. 0. 0. 0.]
[9. 9. 9. 1. 1. 1. 0. 0. 0.]]
k
[[9. 9. 9.]
[9. 9. 9.]
[1. 1. 1.]
[1. 1. 1.]
[0. 0. 0.]
[0. 0. 0.]]
4. ndarray数组的维度变换
函数 | 作用 |
.reshape(shape) | 根据shape生成一个数组,不改变原数组 |
.resize(shape) | 根据shape生成一个数组,直接改变原数组 |
.swapaxes(ax1, ax2) | 将n个维度中的两个维度进行调换 |
.flatten() | 对数组进行降至一维,不改变原数组 |
(1).reshape()方法
a = np.arange(6)
print('a\n', a)
b = a.reshape((2, 3)) # 2行3列的数组
print('b\n', b)
输出结果如下:
a
[0 1 2 3 4 5]
b
[[0 1 2]
[3 4 5]]
(2) .resize()方法
a = np.arange(6)
print('a\n', a)
c = a.resize((2, 3))
print('c\n', c) # 不会生成新数组,输出c为空
print('a\n', a) # 直接改变原数组,输出a发现发生了改变
输出结果如下:
a
[0 1 2 3 4 5]
c
None
a
[[0 1 2]
[3 4 5]]
(3) .swapaxes()方法
a = np.arange(6).reshape(2, 3)
print('a\n', a)
d = a.swapaxes(0, 1) # 改变0维和1维度的顺序
print('d\n', d)
输出结果如下:
a
[[0 1 2]
[3 4 5]]
d
[[0 3]
[1 4]
[2 5]]
(4) .flatten()方法
a = np.arange(6).reshape(2, 3)
print('a\n', a)
e = a.flatten()
print('e\n', e)
输出结果如下:
a
[[0 1 2]
[3 4 5]]
e
[0 1 2 3 4 5]
5. ndarray数组的类型变换
(1) .tolist()函数
a = np.arange(6).reshape(2, 3)
print('a\n', a)
b = a.tolist()
print('b\n', b)
输出结果如下:
a
[[0 1 2]
[3 4 5]]
b
[[0, 1, 2], [3, 4, 5]]
6. 数组的索引和切片
(1)一维数组的索引和切片
a = np.arange(10)
print('a\n', a)
b = a[2] # 数组下标是从0开始的,这里相当于取第3个值
print('b\n', b)
c = a[1:7:2] # 在[1,7)区间中从1开始以2为步长取值
print('c\n', c)
输出结果如下:
a
[0 1 2 3 4 5 6 7 8 9]
b
2
c
[1 3 5]
(2)多维数组的索引
a = np.arange(24).reshape((2, 3, 4))
print('a\n', a)
b = a[0, 1, 2]
print('b\n', b)
c = a[1, 2, -3]
print('c\n', c)
输出结果如下:
a
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
b
6
c
21
(3)多维数组的切片
a = np.arange(24).reshape((2, 3, 4))
print('a\n', a)
b = a[0:1, 0:2, 0:3]
print('b\n', b)
c = a[-2:-1, 1:, :]
print('c\n', c)
输出结果如下:
a
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
b
[[[0 1 2]
[4 5 6]]]
c
[[[ 4 5 6 7]
[ 8 9 10 11]]]
7. 数组与标量的运算
# 数组与标量之间的运算作用于数组的每一个元素
a = np.arange(5)
print('a\n', a)
b = a * 2
print('b\n', b)
c = a / a.mean()
print('c\n', c)
输出结果如下:
a
[0 1 2 3 4]
b
[0 2 4 6 8]
c
[0. 0.5 1. 1.5 2. ]