pip install numpy
NumPy系统是Python的一种开源的数值计算扩展
导包
import numpy as np
查看版本
print(np.__version__) # 获取当前numpy版本号
# 1.21.3
创建ndarray
import numpy as np
t = np.array([1, 2, 3, 4]) # 一维数组
print(t, type(t))
输出:
[1 2 3 4]
t = np.array([[1,2,3],[4,5,6]]) # 二维数组
print(t)
输出: [[1 2 3 4]
[4 5 6 7]]
使用np的routines函数创建
注:函数返回给定形状和数据类型的新数组,其中元素的值设置为1。
shape 形状是一个int或一个int元组,用于定义数组的大小。 如果我们仅指定一个int变量,则将返回一维数组。 对于一个整数元组,将返回给定形状的数组。
dtype是一个可选参数,默认值为float。 它用于指定数组的数据类型,例如int。
order该顺序定义是在内存中以行优先(C风格)还是列优先(F风格)顺序存储多维数组。
t = np.ones([3, 3])
print(t)
输出:
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
t = np.ones([3, 3], dtype=int)
print(t)
输出:
[[1 1 1]
[1 1 1]
[1 1 1]]
numpy.full(shape, fill_value, dtype=None, order=‘C’)[source]
注:返回一个根据指定shape和type,并用fill_value填充的新数组。
shape:整数或整数序列新数组的形态,单个值代表一维,参数传元组,元组中元素个数就代表是几维,例如, (2, 3) or 2.
fill_value: 标量(无向量)填充数组的值
dtype:数据类型,可选默认值为None
查看要填充数组的值数据类型:np.array(fill_value).dtype。
order:{‘C’, ‘F’}, 可选是否在内存中以行为主(C风格)或列为主(Fortran风格)连续(行或列)顺序存储多维数据。
np.full((2,3), 3) # 2行3列,填充值为3
输出:
[[3, 3, 3],
[3, 3, 3]]
numpy.eye(N, M=None, k=0, dtype=
注: 返回一个二维数组,其对角线元素为1,其余位置元素为0。
N返回数组的行数
M列数(不常用)
K对角线的索引:0(默认值)代表主对角线,正整数代表上三角内的对角线,负整数代表下三角内的对角线。
dtype返回数组的数值类型
{‘C’, 'F},可选参数是否在内存中以C或fortran(行或列)顺序存储多维数据,版本1.14.0中的新特性
np.eye(5,k=1) # 5行5列,从第1个元素为对角填充1
返回值:维度为(N,M)的多维数组 除了第k条对角线上元素为1以外,其余元素均为0的数组
输出:
[[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.],
[0., 0., 0., 0., 0.]]
np.eye(3,4) # 3行4列
输出:
[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.]]
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
在指定的大间隔内,返回固定间隔的数据。他将返回“num”个等间距的样本,在区间[start, stop]中。其中,区间的结束端点可以被排除在外。
当‘endpoint=False’时,不包含该点。在这种情况下,队列包含除了“num+1"以外的所有等间距的样本。
要注意的是,当‘endpoint=False’时,步长会发生改变。
np.linspace(0,10,5) # 返回0到10的等差数列(默认包含10)
输出:
[ 0. , 2.5, 5. , 7.5, 10. ]
np.linspace(1,11, 6, retstep=True) # 返回步进差值,二元组
输出:
([ 1., 3., 5., 7., 9., 11.]), 2.0)
注意:np.arange([start, ]stop, [step, ]dtype=None) # 返回等差数列,
区别:
arange()类似于内置函数range(),通过指定开始值、终值和步长创建表示等差数列的一维数组,注意
得到的结果数组不包含终值。
linspace()通过指定开始值、终值和元素个数创建表示等差数列的一维数组,可以通过endpoint参数
指定是否包含终值,默认值为True,即包含终值
np.random.randint(low, high=None, size=None, dtype=‘l’)
随机数组
import numpy as np
r = np.random.randint(0, 10, 6)
print(r)
# 输出: [1 0 1 3 6 4]
np.random.randn(d0, d1, …, dn)
np.random.randn(10)
# 每次都不一样
# 输出结果:
array([-1.74976547, 0.3426804 , 1.1530358 , -0.25243604, 0.98132079,
0.51421884, 0.22117967, -1.07004333, -0.18949583, 0.25500144])
//
np.random.seed(100) #随机的种子,有了种子,每次都一样
np.random.randn(10)
# 输出结果:
array([ 0.37332715, -0.2887605 , 0.04985088, -0.93815832, -0.4087037 ,
1.13352254, 0.52713526, -0.76014192, -0.97292788, 0.16290446])
np.random.random(size=None)
np.random.random(100)
# 每次每次都不一样
# 输出结果:
array([ 0.01150584, 0.52951883, 0.07689008, 0.72856545, 0.26700953,
0.38506149, 0.56252666, 0.59974406, 0.38050248, 0.14719008,
0.6360734 , 0.27812695, 0.73241298, 0.10904588, 0.57071762,
0.56808218, 0.33192772, 0.61444518, 0.07289501, 0.86464595,
0.71140253, 0.3221285 , 0.92556313, 0.26511829, 0.8487166 ,
0.38634413, 0.32169243, 0.80473196, 0.92050868, 0.17325157,
0.63503329, 0.89463233, 0.02796505, 0.04396453, 0.20603116,
0.77663591, 0.96595455, 0.77823865, 0.90867045, 0.39274922,
0.89526325, 0.26002297, 0.38606984, 0.69176715, 0.3170825 ,
0.86994578, 0.35648567, 0.19945661, 0.16109699, 0.58245076,
0.20239367, 0.7099113 , 0.41444565, 0.16725785, 0.01170234,
0.79989105, 0.76490449, 0.25418521, 0.55082581, 0.29550998,
0.02919009, 0.32737646, 0.29171893, 0.67664205, 0.24447834,
0.49631976, 0.41136961, 0.82478264, 0.76439988, 0.78829201,
0.24360075, 0.26151563, 0.51388418, 0.19823452, 0.44097815,
0.53198973, 0.50187154, 0.72374522, 0.11090765, 0.63469357,
0.69199977, 0.97093079, 0.35920669, 0.86493051, 0.01984456,
0.32219702, 0.58608421, 0.26591245, 0.51851213, 0.7896492 ,
0.04914308, 0.28711285, 0.36225247, 0.21299697, 0.99046025,
0.11375325, 0.70964612, 0.06599185, 0.47323442, 0.62003386])
///
np.random.random([3,3])
# 输出结果:
array([[ 0.37590691, 0.15563239, 0.7754904 ],
[ 0.40353019, 0.59708594, 0.57000741],
[ 0.33286511, 0.15678606, 0.58814922]])
np.random.normal(loc=0.0, scale=1.0)
np.random.normal(loc=0.0, scale=1.0)
# 输出: 0.9705556599476601
np.random.rand(d0,d1,…dn)
注:使用方法与np.random.randn()函数相同
作用:
通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1。
应用:在深度学习的Dropout正则化方法中,可以用于生成dropout随机向量(dl),例如(keep_prob表
示保留神经元的比例):dl = np.random.rand(al.shape[0],al.shape[1]) < keep_prob
np.random.rand(1,2,3)
# 输出:
[[[0.77655108 0.94720402 0.60342525]
[0.09466063 0.67177335 0.9059549 ]]]
ndim:维度
shape:形状(各维度的长度)
size:总长度
dtype:元素类型
np.random.seed(0)
x = np.random.randint(10,size=(3,4,5))
print(x)
array([[[5, 0, 3, 3, 7],
[9, 3, 5, 2, 4],
[7, 6, 8, 8, 1],
[6, 7, 7, 8, 1]],
[[5, 9, 8, 9, 4],
[3, 0, 3, 5, 0],
[2, 3, 8, 1, 3],
[3, 3, 7, 0, 1]],
[[9, 9, 0, 4, 7],
[3, 2, 7, 2, 0],
[0, 4, 5, 5, 6],
[8, 4, 1, 4, 9]]])
# 维度:x.ndim
# 形状,各维度的长度:x.shape
# 总长度:x.size
元素类型:x.dtype
索引
# 一维与列表完全一致 多维时同理
np.random.seed(1)
x = np.random.randint(10,size=[3,4,5])
print(x[2,0,0])
print(x)
5
[[[5 8 9 5 0]
[0 1 7 6 9]
[2 4 5 2 4]
[2 4 7 7 9]]
[[1 7 0 6 9]
[9 7 6 9 1]
[0 1 8 8 3]
[9 8 7 3 6]]
[[5 1 9 3 4]
[8 1 4 0 3]
[9 2 0 4 9]
[2 7 7 9 8]]]
切片
np.random.seed(0)
x = np.random.randint(100,size = (10,4))
x
# 输出结果:
array([[44, 47, 64, 67],
[67, 9, 83, 21],
[36, 87, 70, 88],
[88, 12, 58, 65],
[39, 87, 46, 88],
[81, 37, 25, 77],
[72, 9, 20, 80],
[69, 79, 47, 64],
[82, 99, 88, 49],
[29, 19, 19, 14]])
# 切片:
x[7:10]
# 切片结果:
array([[69, 79, 47, 64],
[82, 99, 88, 49],
[29, 19, 19, 14]])
变形
# 使用reshape函数,注意参数是一个tuple!
x = np.arange(0,16).reshape(4,4)
x
# 执行结果:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
# 类型是:
type(x.shape)
级联
np.concatenate() 级联需要注意的点:
级联的参数是列表:一定要加中括号
维度必须相同
形状相符
【重点】级联的方向默认是shape这个tuple的第一个值所代表的维度方向
可通过axis参数改变级联的方向
x = np.array([1,2,3])
y = np.array([1,5,6,7,3,20])
x
# 输出 array([1, 2, 3])
# 输出 array([ 1, 5, 6, 7, 3, 20])
z = np.concatenate([x,y])
z
# 输出 array([ 1, 2, 3, 1, 5, 6, 7, 3, 20])
z.shape
# 输出 (9,)
#二维
x = np.array([[1,2,3],[4,5,6]])
x
array([[1, 2, 3],
[4, 5, 6]])
x.shape
(2,3)
p = np.concatenate([x,x]).shape
p
(4, 3)
axis
import numpy as np
x = np.array([[[1,2,3],[2,2,3],[3,3,3]],[[4,4,4],[5,5,5],[6,6,6]]])
print(x)
print(x.shape)
# 输出:
[[[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]]]
(2, 3, 3)
/
w = np.concatenate([x,x],axis = 0)
print(w.shape)
print(w)
# 输出:
(4, 3, 3)
[[[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]]
[[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]]]
/
w = np.concatenate([x,x],axis = 1)
print(w.shape)
print(w)
# 输出:
(2, 6, 3)
[[[1 2 3]
[2 2 3]
[3 3 3]
[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]
[4 4 4]
[5 5 5]
[6 6 6]]]
//
w = np.concatenate([x,x],axis = 2)
print(w.shape)
print(w)
# 输出:
(2, 3, 6)
[[[1 2 3 1 2 3]
[2 2 3 2 2 3]
[3 3 3 3 3 3]]
[[4 4 4 4 4 4]
[5 5 5 5 5 5]
[6 6 6 6 6 6]]]
np.hstack与np.vstack 水平级联与垂直级联
x = np.array([[1,1],[2,2],[3,3]])
y = np.array([1,2,3])
print(np.hstack(x))
print(np.vstack(y))
# 输出:
[1 1 2 2 3 3]
[[1]
[2]
[3]]
切分
np.split()
x = np.arange(1,10)
x
# 输出:
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
//
x1,x2,x3 = np.split(x,[3,5])
print(x1,x2,x3)
输出: [1 2 3] [4 5] [6 7 8 9]
np.hsplit()
x = np.arange(16).reshape(4,4)
x
# 输出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
//
print(np.hsplit(x,[2,3]))
# 输出:
[array([[ 0, 1],[ 4, 5], [ 8, 9], [12, 13]]),
array([[ 2], [ 6], [10], [14]]),
array([[ 3], [ 7], [11], [15]])]
np.vsplit()
x = np.arange(16).reshape(4,4)
x
# 输出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
print(np.vsplit(x,[2,3]))
//
# 输出:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])]
所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效。
a = np.array([1,2,3])
b=a
print(a,b)
# 输出:
[1 2 3] [1 2 3]
//
b[0]=2
a
# 输出:
array([2, 2, 3])
可使用copy()函数创建副本
a = np.array([1,2,3])
b = a.copy()
b
# 输出:
[1,2,3]
//
b[0]=3
print(a,b)
输出: [1 2 3] [3 2 3]
求和np.sum
import numpy as np
np.random.seed(0)
a = np.random.randint(1000,size = 100)
print(np.sum(a))
//
b = np.random.randint(1000,size = (3,4,5))
print(np.sum(b))
# 输出:
52397
32865
//
# 计算求和时间
%timeit np.sum(a)
# 输出:
2.63 µs ± 34.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
//
l = [1,2,3]
np.sum(l)
最大最小值:np.max/ np.min
# 求平均值
np.mean(heights)
# 求最大值
np.max(heights)
# 求最小值
np.min(heights)
# 计算标准差
heights.std()
ndarray的矩阵操作
算术运算符(加减乘除):
a = np.array([[1,2,3],
[4,5,6]])
a
# 输出:
array([[1, 2, 3],
[4, 5, 6]])
//
a+1
# 输出:
array([[2, 3, 4],
[5, 6, 7]])
//
a*2
# 输出:
array([[ 2, 4, 6],
[ 8, 10, 12]])
//
a+[[1,4,9],[3,3,3]]
# 输出:
array([[ 2, 6, 12],
[ 7, 8, 9]])
//
a*2-2
# 输出:
array([[ 0, 2, 4],
[ 6, 8, 10]])
矩阵积
a = np.array([[1,2,3],
[4,5,6]])
a
# 输出:
array([[1, 2, 3],
[4, 5, 6]])
//
b = np.array([[1,1],
[1,1],
[1,1]])
b
# 输出:
array([[1, 1],
[1, 1],
[1, 1]])
//
np.dot(a,b)
# 输出:
array([[ 6, 6],
[15, 15]])
【重要】ndarray广播机制的两条规则
规则一:为缺失的维度补1
规则二:假定缺失元素用已有值填充
# 例1: m = np.ones((2, 3)) a = np.arange(3) 求m+a
m = np.ones((2,3))
m
# 输出:
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
a = np.arange(3)
a
# 输出:
array([0, 1, 2])
m+a
# 输出:
array([[ 1., 2., 3.],
[ 1., 2., 3.]])
# 例2: a = np.arange(3).reshape((3, 1)) b = np.arange(3) 求a+b
a = np.arange(3).reshape((3,1))
a
# 输出:
array([[0],
[1],
[2]])
b = np.arange(3)
b
# 输出:
array([0, 1, 2])
a+b
# 输出:
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
# 习题 a = np.ones((4, 1)) b = np.arange(4) 求a+b
a = np.ones((4,1))
b = np.arange(4)
a+b
# 输出:
array([[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.]])
ndarray的排序
选择排序
import numpy as np
a = np.array([33,2,67,9,88,22,34])
def selectSort(x):
for i in range(len(x)):
swap = np.argmin(x[i:])+i
[x[i],x[swap]] = [x[swap],x[i]]
selectSort(a)
a
# 输出:
array([ 2, 9, 22, 33, 34, 67, 88])
快速排序
# np.sort()与ndarray.sort()都可以,但有区别:
# 1. np.sort()不改变输入
# 2. ndarray.sort()本地处理,不占用空间,但改变输入
# np.sort()不改变输入
np.random.seed(10)
a = np.random.randint(0,100,10)
b = np.random.randint(0,100,10)
print(a,b)
print(np.sort(a),a)
# 输入:
[ 9 15 64 28 89 93 29 8 73 0] [40 36 16 11 54 88 62 33 72 78]
[ 0 8 9 15 28 29 64 73 89 93] [ 9 15 64 28 89 93 29 8 73 0]
# ndarray.sort()本地处理,不占用空间,但改变输入
np.random.seed(20)
a = np.random.randint(0,100,10)
b = np.random.randint(0,100,10)
print(a,b)
print(a.sort(),a)
# 输出:
[99 90 15 95 28 90 9 20 75 22] [71 34 96 40 85 90 26 83 16 62]
None [ 9 15 20 22 28 75 90 90 95 99]