1 引入
目的如下。
处理多维数组。
一般引用名称为 np 。
import numpy as np
1.1 ndarray 数组与 list 列表的区别
1.1.1 局限
数组要求相同类型。
1.1.2 优势
- 矢量运算
- 运算时有广播能力
- 速度快
- 内存少
import numpy as np
a = [1, 2, 3]
b = [2, 4, 6]
c = np.array([1, 2, 3])
d = np.array([2, 4, 6])
print(a + b) # [1, 3, 5, 2, 4, 6]
print(c + d) # [3 6 9]
1.2 创建数组
1.2.1 array 函数
使用 array 函数。可以用 ndmin 指定其维度。值得注意的是,此时创建的类型不是列表list,而是数组numpy.ndarray。
import numpy as np
a = np.array([1, 2], [3, 4])
print(a)
'''
[[1 2]
[3 4]]
'''
b = np.array([1, 2, 3, 4], admin=2)
print(b) # [[1 2 3 4]]
1.2.2 arange 函数
可以用 arange 函数创建内容为等差数列的数组。
import numpy as np
a = np.arange(0, 10, 2)
print(a) # [0 2 4 6 8]
1.2.3 random 函数
使用 np.random.random((m, n)) 生成 m行n列 的随机数组,内容为0~1间的浮点数。
import numpy as np
a = np.random.random((3, 2))
print(a)
'''
[[0.97770905 0.83878187]
[0.0070722 0.9113544 ]
[0.13058777 0.72357741]]
'''
使用 np.random.randint(x, y, size=(m, n)) 生成 m行n列 的随机数组,内容为x~y间的整数。
import numpy as np
b = np.random.randint(0, 10, size=(3, 2))
print(b)
'''
[[5 5]
[7 3]
[4 0]]
'''
1.2.4 zeros, ones, full 函数
可以创建一个全为零、一或指定值的数组。
import numpy as np
m = 2 # row
n = 3 # column
a = np.zeros((m, n))
b = np.ones((m, n))
c = np.full((m, n), 8)
print(a)
'''
[[0. 0. 0.]
[0. 0. 0.]]
'''
print(b)
'''
[[1. 1. 1.]
[1. 1. 1.]]
'''
print(c)
'''
[[8 8 8]
[8 8 8]]
'''
1.2.5 eye 函数
生成一个对角线为 1,其他为 0 的数组。
import numpy as np
a = np.eye(3)
print(a)
'''
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
'''
2 结构化数据类型
2.1 数据类型
名称 | 描述 | 简写 |
---|---|---|
bool_ | 布尔 | ? |
int_ | 整数 | i4 |
int8 | 整数 | i1 或 b |
int16 | 整数 | i2 |
int32 | 整数 | i4 |
int64 | 整数 | i8 |
uint8 | 无符号整数 | u1 |
uint16 | 无符号整数 | u2 |
uint32 | 无符号整数 | u4 |
uint64 | 无符号整数 | u8 |
float_ | 双精度浮点数 | f8 |
float16 | 半精度浮点数 | f2 |
float32 | 单精度浮点数 | f4 或 f |
float64 | 双精度浮点数 | f8 或 d |
complex_ | 128位复数 | c16 |
complex64 | 复数,双32位浮点 | c8 |
complex128 | 复数,双32位浮点 | c16 |
string | 字符串 | S |
*注:S10表示一个10位的字符串,且储存时为编码形式。
2.2 定义数据类型
使用 dtype 函数定义数据类型。
import numpy as np
dt1 = np.dtype(np.int32)
dt2 = np.dtype('i4')
print(dt1) # int32
print(dt2) # int32
也可以定义字段和数据类型。如果要取出字符串,则需要解码。
import numpy as np
dt = np.dtype([("name", 'S20'), ("salary", 'f2'), ("age", 'i1')])
mate = np.array([("LiHua", 53.4, 17), ("John", 21.5, 18)], dtype=dt)
print(mate[1]['name']) # b'John'
print(mate[1]['name'].decode('utf-8')) # John
需要注意的是,如果类型是字符串,则会将非字符串的内容转化为字符串。
import numpy as np
a = np.array([1, 2, 3, 4], dtype='S10')
print(a) # [b'1' b'2' b'3' b'4']
2.3 修改数据类型
可以用 astype 函数修改数组的数据类型。
import numpy as np
a = np.array([1, 2, 3], dtype='i1')
print(a) # [1 2 3]
b = a.astype('f2')
print(b) # [1. 2. 3.]
3 增删改查
3.1 数组维度
使用 ndim 函数获取数组维度。
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a.ndim) # 2
3.2 数组形状
3.2.1 shape 函数
使用 shape 函数查询数组几行几列,以元组形式返回。元组的元素从左到右分别是数组的中括号由外到内的元素数。
import numpy as np
a = np.array([[1, 2], [3, 4], [5, 6]])
print(a.shape) # (3, 2)
3.2.2 reshape 函数
可以使用 reshape 函数。使用时必须确保改后元素总数不变。
import numpy as np
a = np.array([[[1, 2], [2, 3]], [[3, 4], [5, 6]]])
b = a.reshape(2, 4)
print(b)
'''
[[1 2 2 3]
[3 4 5 6]]
'''
3.2.3 数组扁平化
可以使用 reshape(-1) 实现。
import numpy as np
a = np.array([[[1, 2], [2, 3]], [[3, 4], [5, 6]]])
b = a.reshape(-1)
print(b) # [1 2 2 3 3 4 5 6]
可以使用 flatten 函数,此时返回数组的拷贝,对拷贝所做的修改不影响原始数组。
import numpy as np
a = np.array([[[1, 2], [2, 3]], [[3, 4], [5, 6]]])
b = a.flatten()
print(b) # [1 2 2 3 3 4 5 6]
可以使用 ravel() 函数,此时返回展开数组,对其所做的修改会影响原始数组。
import numpy as np
a = np.array([[[1, 2], [2, 3]], [[3, 4], [5, 6]]])
b = a.ravel()
print(b) # [1 2 2 3 3 4 5 6]
b[1] = 114514
print(a)
'''
[[[1 114514]
[2 3]]
[[3 4]
[5 6]]]
'''
3.3 flat 数组元素迭代器
flat 属性是数组元素迭代器。
import numpy as np
a = np.arange(9).reshape(3, 3)
print(f"Original:\n{a}")
print("________________")
print("Every row:")
for row in a:
print(row)
print("________________")
print("Iterated array:")
for item in a.flat:
print(item)
'''
Original:
[[0 1 2]
[3 4 5]
[6 7 8]]
________________
Every row:
[0 1 2]
[3 4 5]
[6 7 8]
________________
Iterated array:
0
1
2
3
4
5
6
7
8
'''
3.4 元素个数和内存大小
3.4.1 size 属性
使用 size 属性查询元素个数。
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a.size) # 5
3.4.2 itemsize 属性
使用 itemsize 属性查看每个元素所占字节数。
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a.itemsize) # 4
3.4.3 nbytes 属性
将两者相乘可以查询数组中的元素所占总内存数,也可以用 nrbytes 属性查询,两者是等效的。
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a.size * a.itemsize) # 20
print(a.nbytes) # 20
3.4.4 sys.getsizeof 函数
如果要查询整个数组所占内存,即包括数组这个容器和元素所占的内存,则使用 sys 库中的 getsizeof 函数。
import numpy as np
import sys
a = np.array([1, 2, 3, 4, 5])
print(sys.getsizeof(a)) # 132
b = np.array([])
print(sys.getsizeof(b)) # 112
3.5 索引和切片
3.5.1 一维数组
与列表list操作相同。
3.5.2 二维数组
获取某行某列数据有两种形式。
import numpy as np
a = np.array([
[1, 2],
[3, 4],
[5, 6],
[7, 8]
])
print(a[2, 1]) # 6
print(a[2][1]) # 6
如果要同时获取多个元素,则将元素的行索引和列索引各自列为列表,且返回一个数组。
import numpy as np
a = np.array([
[1, 2],
[3, 4],
[5, 6],
[7, 8]
])
print(a[[1, 2], [0, 1]]) # [3 6]
如果要获取某几行的数据,则使用2个中括号。
import numpy as np
a = np.array([
[1, 2],
[3, 4],
[5, 6],
[7, 8]
])
print(a[[0, 2]])
'''
[[1 2]
[5 6]]
'''
进行切片时,也可以用 [r1:r2:r, c1:c2:c] 的形式。
import numpy as np
a = np.array([
[1, 2],
[3, 4],
[5, 6],
[7, 8]
])
print(a[:, 1]) # [2 4 6 8]
print(a[::2, 0]) # [1 5]
print(a[[1, 3], :])
'''
[[3 4]
[7 8]]
'''
print(a[-3:-5:-1, ::-1])
'''
[[4 3]
[2 1]]
'''
3.5.3 布尔索引
创建一个与原始数组元素数量相同的布尔数组 (或列表),将此布尔数组作为原始数组的索引,则会返回所有 True 的元素,以数组的形式呈现。
import numpy as np
arr = np.arange(7)
b = [True, False, True, False, False, False, True]
print(arr[b]) # [0 2 6]
使用数组的判断句,将会返回相应的布尔数组。
import numpy as np
arr = np.arange(1, 6)
print(arr > 3) # [False False False True True]