机器学习2-NumPy
ndarray自动广播扩展维度,便于进行行列式,数组计算
# 自动广播机制,1维数组和2维数组相加# 二维数组维度 2x5
# array([[ 1, 2, 3, 4, 5],
# [ 6, 7, 8, 9, 10]])
d = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
# c是一维数组,维度5
# array([ 4, 6, 8, 10, 12])
c = np.array([ 4, 6, 8, 10, 12])
e = d + c
e# 输出
array([[ 5, 8, 11, 14, 17], [10, 13, 16, 19, 22]])
创建ndarray
# 导入numpy
import numpy as np# 1、从list创建array
a = [1,2,3,4,5,6] # 创建简单的列表
b = np.array(a) # 将列表转换为数组
b
# 输出
array([1, 2, 3, 4, 5, 6])# 2、arange:创建元素从0到10依次递增2的数组
# 通过np.arange创建
# 通过指定start, stop (不包括stop),interval来产生一个1维的ndarray
a = np.arange(0, 10, 2)
a
# 输出
array([0, 2, 4, 6, 8])# 3、zeros:创建指定长度或者形状的全0数组
a = np.zeros([3,3])
a
# 输出
array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])# 4、ones:创建指定长度或者形状的全1数组
a = np.ones([3,3])
a
# 输出
array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])
ndarray的属性包括shape
、dtype
、size
和ndim
等,通过如下代码可以查看ndarray数组的属性。
shape
:数组的形状 ndarray.shape,1维数组(N,)(N,),2维数组(M,N)(M,N),3维数组(M,N,K)3维数组(M,N,K)。dtype
:数组的数据类型。size
:数组中包含的元素个数ndarray.size
,其大小等于各个维度的长度的乘积。ndim
:数组的维度大小ndarray.ndim
, 其大小等于ndarray.shape
所包含元素的个数。
a = np.ones([3, 3])
print('a, dtype: {}, shape: {}, size: {}, ndim: {}'.format(a.dtype, a.shape, a.size, a.ndim))
a, dtype: float64, shape: (3, 3), size: 9, ndim: 2
创建ndarray之后,可以对其数据类型或形状进行修改,代码实现如下:
# 转化数据类型
b = a.astype(np.int64)
print('b, dtype: {}, shape: {}'.format(b.dtype, b.shape))# 改变形状
c = a.reshape([1, 9])
print('c, dtype: {}, shape: {}'.format(c.dtype, c.shape))
数组间运算
# 数组 减去 数组, 用对应位置的元素相减
arr1 = np.array([[1., 2., 3.], [4., 5., 6.]])
arr2 = np.array([[11., 12., 13.], [21., 22., 23.]])
# 数组 乘以 数组,用对应位置的元素相乘
arr1 * arr2
array([[ 11., 24., 39.], [ 84., 110., 138.]])# 数组开根号,将每个位置的元素都开根号
arr ** 0.5
array([[1. , 1.41421356, 1.73205081], [2. , 2.23606798, 2.44948974]])
切片上的操作都会改变原数组,除非用np.copy创建新的内存空间
# 数组切片产生的新数组,还是指向原来的内存区域,数据不会被复制。
# 视图上的任何修改都会直接反映到源数组上。
a = np.arange(30)
arr_slice = a[4:7]
arr_slice[0] = 100
a, arr_slice
(array([ 0, 1, 2, 3, 100, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]), array([100, 5, 6]))# 通过copy给新数组创建不同的内存空间
a = np.arange(30)
arr_slice = a[4:7]
arr_slice = np.copy(arr_slice)
arr_slice[0] = 100
a, arr_slice
(array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]), array([100, 5, 6]))
mean
:计算算术平均数,零长度数组的mean为NaN。std
和var
:计算标准差和方差,自由度可调(默认为n)。sum
:对数组中全部或某轴向的元素求和,零长度数组的sum为0。max
和min
:计算最大值和最小值。argmin
和argmax
:分别为最大和最小元素的索引。cumsum
:计算所有元素的累加。cumprod
:计算所有元素的累积。
随机数np.random
# 可以多次运行,观察程序输出结果是否一致
# 如果不设置随机数种子,观察多次运行输出结果是否一致
np.random.seed(10)
a = np.random.rand(3, 3)
# 设置了随机数种子,每次输出都一样# 生成均匀分布随机数,随机数取值范围在[0, 1)之间
a = np.random.rand(3, 3)
a
array([[0.08833981, 0.68535982, 0.95339335], [0.00394827, 0.51219226, 0.81262096], [0.61252607, 0.72175532, 0.29187607]])# 生成均匀分布随机数,指定随机数取值范围和数组形状
a = np.random.uniform(low = -1.0, high = 1.0, size=(2,2))
a
array([[ 0.83554825, 0.42915157], [ 0.08508874, -0.7156599 ]])# 生成标准正态分布随机数
a = np.random.randn(3, 3)
a
array([[ 1.484537 , -1.07980489, -1.97772828], [-1.7433723 , 0.26607016, 2.38496733], [ 1.12369125, 1.67262221, 0.09914922]])# 生成正态分布随机数,指定均值loc和方差scale
a = np.random.normal(loc = 1.0, scale = 1.0, size = (3,3))
a
array([[2.39799638, 0.72875201, 1.61320418], [0.73268281, 0.45069099, 1.1327083 ], [0.52385799, 2.30847308, 1.19501328]])# 打乱数组顺序(只打乱第一维)
# 生成一维数组
a = np.arange(0, 30)
# 打乱一维数组顺序
np.random.shuffle(a)# 随机选取部分元素
a = np.arange(30)
b = np.random.choice(a, size=5)
线性代数
diag
:以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0)。dot
:矩阵乘法。trace
:计算对角线元素的和。det
:计算矩阵行列式。eig
:计算方阵的特征值和特征向量。inv
:计算方阵的逆。
文件读写
# 使用np.fromfile从文本文件'housing.data'读入数据
# 这里要设置参数sep = ' ',表示使用空白字符来分隔数据
# 空格或者回车都属于空白字符,读入的数据被转化成1维数组
d = np.fromfile('./work/housing.data', sep = ' ')# save & load
# 产生随机数组a
a = np.random.rand(3,3)
np.save('a.npy', a)# 从磁盘文件'a.npy'读入数组
b = np.load('a.npy')
np.exp(x) --计算x的指数值