Numpy¶
numpy 本身可能实用性较低,但是我们学的其他处理数据处理的库大都基于 numpy ,所以 numpy 是基础。
In [1]:
Copied!
import numpy as np
np.random.seed(0) # 设置随机种子,使得每次运行得到的随机数都一样
import numpy as np
np.random.seed(0) # 设置随机种子,使得每次运行得到的随机数都一样
创建 ¶
In [2]:
Copied!
# 列表(copy 表示复制还是引用,subok 表示是否保留子数据类型),元组,全 0, 全 1,指定填充,全空(随机小值),等差数列(步长),等差数列(个数),等比数列,随机整数,[0,1)均匀分布, 正态分布,单位矩阵,对角矩阵,重复元素(axis 表示重复的方向),迭代对象
np.array([1,2,3], copy=False, subok=False), np.array((1, 2, 3, 4)).reshape(2, 2), np.zeros(3), np.ones((2, 3), dtype="S2"), np.full((2, 2), 3.14), np.empty((3, 2)), np.arange(0, 11, 2).reshape(3,2), np.linspace(1, 10, 5), np.logspace(0, 5, num=6, endpoint=True, base=2.0), np.random.randint(low=0, high=10, size=(3, 2)), np.random.random(size=(2, 3)), np.random.normal(size=(1, 3)), np.eye(N=3, k=0), np.diag([1, 2, 3, 4]), np.repeat([1, 2, 3], 4, axis=0).reshape(4, 3), np.fromiter(iter(range(10)), dtype=int, count=6)
# 列表(copy 表示复制还是引用,subok 表示是否保留子数据类型) ,元组,全 0, 全 1,指定填充,全空(随机小值) ,等差数列(步长) ,等差数列(个数) ,等比数列,随机整数,[0,1) 均匀分布, 正态分布,单位矩阵,对角矩阵,重复元素(axis 表示重复的方向) ,迭代对象
np.array([1,2,3], copy=False, subok=False), np.array((1, 2, 3, 4)).reshape(2, 2), np.zeros(3), np.ones((2, 3), dtype="S2"), np.full((2, 2), 3.14), np.empty((3, 2)), np.arange(0, 11, 2).reshape(3,2), np.linspace(1, 10, 5), np.logspace(0, 5, num=6, endpoint=True, base=2.0), np.random.randint(low=0, high=10, size=(3, 2)), np.random.random(size=(2, 3)), np.random.normal(size=(1, 3)), np.eye(N=3, k=0), np.diag([1, 2, 3, 4]), np.repeat([1, 2, 3], 4, axis=0).reshape(4, 3), np.fromiter(iter(range(10)), dtype=int, count=6)
Out[2]:
(array([1, 2, 3]), array([[1, 2], [3, 4]]), array([0., 0., 0.]), array([[b'1', b'1', b'1'], [b'1', b'1', b'1']], dtype='|S2'), array([[3.14, 3.14], [3.14, 3.14]]), array([[4.65103707e-310, 0.00000000e+000], [6.89842179e-310, 6.89839832e-310], [6.89839832e-310, 6.89842143e-310]]), array([[ 0, 2], [ 4, 6], [ 8, 10]]), array([ 1. , 3.25, 5.5 , 7.75, 10. ]), array([ 1., 2., 4., 8., 16., 32.]), array([[5, 0], [3, 3], [7, 9]]), array([[0.6235637 , 0.38438171, 0.29753461], [0.05671298, 0.27265629, 0.47766512]]), array([[-0.08767307, 1.36687937, 1.1253141 ]]), array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]), array([[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 3, 0], [0, 0, 0, 4]]), array([[1, 1, 1], [1, 2, 2], [2, 2, 3], [3, 3, 3]]), array([0, 1, 2, 3, 4, 5]))
In [3]:
Copied!
## like 生成已有 ndarray 同形状的 ndarray
np.zeros_like([[1,2,3], [4,5,6]]), np.ones_like([[1,2,3], [4,5,6]]), np.full_like([[1,2,3], [4,5,6]], 3.14), np.empty_like([[1,2,3], [4,5,6]])
## like 生成已有 ndarray 同形状的 ndarray
np.zeros_like([[1,2,3], [4,5,6]]), np.ones_like([[1,2,3], [4,5,6]]), np.full_like([[1,2,3], [4,5,6]], 3.14), np.empty_like([[1,2,3], [4,5,6]])
Out[3]:
(array([[0, 0, 0], [0, 0, 0]]), array([[1, 1, 1], [1, 1, 1]]), array([[3, 3, 3], [3, 3, 3]]), array([[139625615228192, 139625615228192, 139625610902768], [139625594252048, 139625569475632, 139625612388752]]))
属性 ¶
In [4]:
Copied!
A = np.array([[1,2,3], [4,5,6]])
# 维度,形状,元素个数,元素类型,每个元素占用的字节数,总字节数,步长,基础对象(见后),标志
A.ndim, A.shape, A.size, A.dtype, A.itemsize, A.nbytes, A.strides, A.base, A.flags
A = np.array([[1,2,3], [4,5,6]])
# 维度,形状,元素个数,元素类型,每个元素占用的字节数,总字节数,步长,基础对象(见后),标志
A.ndim, A.shape, A.size, A.dtype, A.itemsize, A.nbytes, A.strides, A.base, A.flags
Out[4]:
(2, (2, 3), 6, dtype('int64'), 8, 48, (24, 8), None, C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False)
In [5]:
Copied!
# 操作,base 如果为空则表示自己是基础对象,否则表示自己是一个视图;分别对应复制和引用操作
B = np.array([[1,2,3],[4,5,6]])
B_array = np.array([1,2,3,4,5,6])
B1 = B.copy() # 复制
B2 = B.view() # 视图(引用)
B3 = B.reshape((3,2)) # 重塑(引用)
B4 = B.T # 转置(引用)
B5 = B.flatten() # 拉平(复制)
B6 = B.ravel() # 拉平(引用,但是当B内存上不连续时也是复制)
B7 = B.astype(np.float64) # 转换类型(复制)
B8 = B # 引用
B9 = B.tolist() # 转换为列表(不再是ndarray,理应算复制)
B.base, B1.base, B2.base, B3.base, B4.base, B5.base, B6.base, B7.base, B8.base
# 操作,base 如果为空则表示自己是基础对象,否则表示自己是一个视图;分别对应复制和引用操作
B = np.array([[1,2,3],[4,5,6]])
B_array = np.array([1,2,3,4,5,6])
B1 = B.copy() # 复制
B2 = B.view() # 视图(引用)
B3 = B.reshape((3,2)) # 重塑(引用)
B4 = B.T # 转置(引用)
B5 = B.flatten() # 拉平(复制)
B6 = B.ravel() # 拉平(引用,但是当B内存上不连续时也是复制)
B7 = B.astype(np.float64) # 转换类型(复制)
B8 = B # 引用
B9 = B.tolist() # 转换为列表(不再是ndarray,理应算复制)
B.base, B1.base, B2.base, B3.base, B4.base, B5.base, B6.base, B7.base, B8.base
Out[5]:
(None, None, array([[1, 2, 3], [4, 5, 6]]), array([[1, 2, 3], [4, 5, 6]]), array([[1, 2, 3], [4, 5, 6]]), None, array([[1, 2, 3], [4, 5, 6]]), None, None)
In [6]:
Copied!
# 操作,直接作用在 ndarray 上
Bfill = np.arange(12).reshape(3, 4)
Bshuffle = np.arange(12).reshape(3, 4)
Bfill.fill(3.14) # 会被强制转换为原数据类型
np.random.shuffle(Bshuffle) # 打乱顺序
Bfill, Bshuffle, Bfill.base, Bshuffle.base
# 操作,直接作用在 ndarray 上
Bfill = np.arange(12).reshape(3, 4)
Bshuffle = np.arange(12).reshape(3, 4)
Bfill.fill(3.14) # 会被强制转换为原数据类型
np.random.shuffle(Bshuffle) # 打乱顺序
Bfill, Bshuffle, Bfill.base, Bshuffle.base
Out[6]:
(array([[3, 3, 3, 3], [3, 3, 3, 3], [3, 3, 3, 3]]), array([[ 8, 9, 10, 11], [ 4, 5, 6, 7], [ 0, 1, 2, 3]]), array([3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]), array([ 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3]))
操作 ¶
In [7]:
Copied!
# nditer 顺序遍历所有元素
C = np.array([[[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]])
for i,j in np.nditer([B, C]): # nditer 迭代器,可以利用广播机制同时迭代多个数组
print(i,j, end=" ")
print()
for i, j in zip(B.flat, C.flat): # flatiter 迭代器,使用zip达成的效果一般
print(i,j, end=" ")
# nditer 顺序遍历所有元素
C = np.array([[[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]])
for i,j in np.nditer([B, C]): # nditer 迭代器,可以利用广播机制同时迭代多个数组
print(i,j, end=" ")
print()
for i, j in zip(B.flat, C.flat): # flatiter 迭代器,使用zip达成的效果一般
print(i,j, end=" ")
1 1 2 2 3 3 4 4 5 5 6 6 1 7 2 8 3 9 4 10 5 11 6 12 1 1 2 2 3 3 4 4 5 5 6 6
In [8]:
Copied!
# savetext 保存到文件
D1 = np.random.randint(0, 10, (3, 4))
np.savetxt('dataBase/D.txt', D1, delimiter=","), D1.dtype
# savetext 保存到文件
D1 = np.random.randint(0, 10, (3, 4))
np.savetxt('dataBase/D.txt', D1, delimiter=","), D1.dtype
Out[8]:
(None, dtype('int64'))
In [9]:
Copied!
# loadtext 从文件读取
D2 = np.loadtxt('dataBase/D.txt', delimiter=',')
# loadtext 从文件读取
D2 = np.loadtxt('dataBase/D.txt', delimiter=',')
In [10]:
Copied!
# 水平/垂直拼接(图像拼接比较方便)
np.hstack([B1, B2]), np.vstack([B1, B2])
# 水平 / 垂直拼接(图像拼接比较方便)
np.hstack([B1, B2]), np.vstack([B1, B2])
Out[10]:
(array([[1, 2, 3, 1, 2, 3], [4, 5, 6, 4, 5, 6]]), array([[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]))