本篇主要介绍numpy中的数组操作:
1.多维数组的一元操作
2.组合数组
3.数组分割
4.数组复制
1.多维数组的一元操作
sum min max amax amin mean add multiply
np.abs(a) np.fabs(a) : 取各元素的绝对值
np.sign(a) : 计算各元素的符号值 1(+),0,-1(-)
np.sqrt(a) : 计算各元素的平方根
np.square(a): 计算各元素的平方
np.log(a) np.log10(a) np.log2(a) : 计算各元素的自然对数、10、2为底的对数np.exp(a) : 计算各元素的指数值
np.ceil(a) np.floor(a) : 计算各元素的ceiling 值, floor值(ceiling向上取整,floor向下取整)
np.rint(a) : 各元素 四舍五入
np.modf(a) : 将数组各元素的小数和整数部分以两个独立数组形式返回
sum
语法格式:
数组名称.sum(axis=某维)
其余维不变,对指定维求和,指定维消失。
不指定维数,表示对数组所有元素求和。
二维数组较好理解,如
b = np.arange(12).reshape(3,4)
b维度(3,4)
axis=0,在第一维度上求和,即按列求和,在行上压缩数据
axis=1,在第二维度上求和,即按行求和,在列上压缩数据
如:
b = np.arange(12).reshape(3,4)
'''
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
'''
b.sum(axis=0) # 按列求和
'''
array([12, 15, 18, 21])
'''
b.sum(axis=1) # 按行求和
'''
array([ 6, 22, 38])
'''
b=np.arange(24).reshape(2,3,4)
b
'''
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]]])
'''
b.sum(axis=0)
'''
array([[12, 14, 16, 18],
[20, 22, 24, 26],
[28, 30, 32, 34]])
'''
#(2,3,4)变为(3,4) 下标2的维消失,可以想象成数据压缩到了指定维上
b.sum(axis=1)
'''
array([[12, 15, 18, 21],
[48, 51, 54, 57]])
'''
#(2,3,4)变为(2,4)
b.sum(axis=2)
'''
array([[ 6, 22, 38],
[54, 70, 86]])
'''
#(2,3,4)变为(2,3)
b.sum(axis=0) 等同与 b[0,:,:]+b[1,:,:]
b.sum(axis=1) 等同与 b[:,0,:]+b[:,1,:]+b[:,2,:]
b.sum(axis=2) 等同与 b[:,:,0]+b[:,:,1]+b[:,:,2]+b[:,:,3]
min、max、amin、amax
语法格式:
数组名称.min(axis=某维)
同
numpy.amin(数组名称,axis=某维
指定维度下,其他维最小值
数组名称.max(axis=某维)
同
numpy.amax(数组名称,axis=某维)
指定维度下,其他维的最大值
未指定维度时,默认求数组所有元素的最大值、最小值
a = np.random.random((2,3))
'''
array([[0.74914116, 0.92214776, 0.4532684 ],
[0.24116831, 0.69004573, 0.4828824 ]])
'''
a.min()
np.amin(a)
'''
0.24116831076315193
'''
a.max()
np.amax(a)
'''
0.9221477648955041
'''
a.min(axis=0)#在第0维上,对第1维求最小值,即求了每一列的最小值
np.amin(a,axis=0)
'''
array([0.24116831, 0.69004573, 0.4532684 ])
'''
a.min(axis=1)#在第1维上,对第0维求最小值,即求了每一列的最小值
np.amin(a,axis=1)
'''
array([0.4532684 , 0.24116831])
'''
a.max(axis=1)
np.amax(a,axis=1)
'''
array([0.92214776, 0.69004573])
'''
a.max(axis=0)
np.amax(a,axis=0)
'''
array([0.74914116, 0.92214776, 0.4828824 ])
'''
b=np.arange(24).reshape(2,3,4)
b
'''
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]]])
'''
b.max(axis=0)#求了第1、2维上的最大值
np.amax(b,axis=0)
'''
array([[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])
'''
mean
语法格式:
numpy.mean(数组名称,axis=指定维数)
在指定维上求平均值
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
# 求每一列的平均值
result = np.mean(stus_score, axis=0)
print(result)
#[81.4 81.6]
# 求每一行的平均值
result = np.mean(stus_score, axis=1)
#[84. 81.5 79.5 84.5 78. ]
add
multiply
在计算array数据类型时,*和multiply都表示对应元素的数乘。在计算matrix数据类型时,*就是和线性代数中矩阵运算规则一样,multiply依旧是对应元素的数乘。
语法格式:
numpy.multiply(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = <ufunc 'multiply'>
x1 和 x2的element-wise乘积,保证x1和x2有相同的维数,或者进行broadcast之后两者有相同的维数
如:
x1 = np.arange(9.0).reshape((3, 3))
x2 = np.arange(3.0)
np.multiply(x1, x2)
'''
array([[ 0., 1., 4.],
[ 0., 4., 10.],
[ 0., 7., 16.]])
'''
np.abs(a) np.fabs(a) : 取各元素的绝对值
np.sign(a) : 计算各元素的符号值 1(+),0,-1(-)
np.sqrt(a) : 计算各元素的平方根
np.square(a): 计算各元素的平方
np.log(a) np.log10(a) np.log2(a) : 计算各元素的自然对数、10、2为底的对数np.exp(a) : 计算各元素的指数值
np.ceil(a) np.floor(a) : 计算各元素的ceiling 值, floor值(ceiling向上取整,floor向下取整)
np.rint(a) : 各元素 四舍五入
np.modf(a) : 将数组各元素的小数和整数部分以两个独立数组形式返回
a = np.array([[-1,2,-3],[4,5,-6]])
'''
array([[-1, 2, -3],
[ 4, 5, -6]])'''
#取各元素的绝对值 fabs()函数只适用于float和integer类型,而abs()也适用于复数
np.abs(a)
'''
array([[1, 2, 3],
[4, 5, 6]])
'''
np.fabs(a)
'''
array([[1., 2., 3.],
[4., 5., 6.]])
'''
np.sign(a)#计算各元素的符号值 1(+),0,-1(-)
'''
array([[-1, 1, -1],
[ 1, 1, -1]])
'''
a = np.array([[1,2,3],[4,5,6]])
'''
array([[1, 2, 3],
[4, 5, 6]])
'''
#计算各元素的平方根
np.sqrt(a)
'''
array([[1. , 1.41421356, 1.73205081],
[2. , 2.23606798, 2.44948974]])
'''
#计算各元素的平方
np.square(a)
'''
array([[ 1, 4, 9],
[16, 25, 36]], dtype=int32)
'''
#计算各元素的自然对数、10、2为底的对数
np.log(a)
'''
array([[0. , 0.69314718, 1.09861229],
[1.38629436, 1.60943791, 1.79175947]])
'''
np.log10(a)
'''
array([[0. , 0.30103 , 0.47712125],
[0.60205999, 0.69897 , 0.77815125]])
'''
np.log2(a)
'''
array([[0. , 1. , 1.5849625 ],
[2. , 2.32192809, 2.5849625 ]])
'''
np.exp(a)#计算各元素的指数值
'''
array([[ 2.71828183, 7.3890561 , 20.08553692],
[ 54.59815003, 148.4131591 , 403.42879349]])
'''
a=np.random.random((2,3))*10
'''
array([[5.79922262e+00, 6.51265142e+00, 2.52131915e+00],
[3.57394912e+00, 4.13644919e-03, 8.35016334e+00]])
'''
#计算各元素的ceiling 值, floor值(ceiling向上取整,floor向下取整)
np.ceil(a)
'''
array([[6., 7., 3.],
[4., 1., 9.]])
'''
np.floor(a)
'''
array([[5., 6., 2.],
[3., 0., 8.]])
'''
np.rint(a)#各元素 四舍五入
'''
array([[6., 7., 3.],
[4., 0., 8.]])
'''
np.modf(a)#将数组各元素的小数和整数部分以两个独立数组形式返回
'''
(array([[0.79922262, 0.51265142, 0.52131915],
[0.57394912, 0.00413645, 0.35016334]]), array([[5., 6., 2.],
[3., 0., 8.]]))
'''
2.组合数组
vstack
语法格式:
numpy.vstack(tup)
(a1,a2,...):元组,列表,或者numpy数组
返回结果为numpy的数组,垂直(按照行顺序)的把数组给堆叠起来。
hstack
语法格式:
numpy.hstack((a1,a2,...))
(a1,a2,...):元组,列表,或者numpy数组
返回结果为numpy的数组,水平(按照列顺序)的把数组给堆叠起来。
concatenate
语法格式:
numpy.concatenate((a1, a2, ...), axis=0)
根据指定的维度,对一个元组、列表中的list或者数组进行连接
例子:
a = np.floor(10*np.random.random((2,2)))
'''
输出:
array([[ 5., 2.],
[ 6., 2.]])
'''
b = np.floor(10*np.random.random((2,2)))
'''
输出:
array([[ 0., 2.],
[ 4., 1.]])
'''
np.vstack((a,b))
'''
输出:
array([[ 5., 2.],
[ 6., 2.],
[ 0., 2.],
[ 4., 1.]])
'''
np.hstack((a,b))
'''
输出:
array([[ 5., 2., 0., 2.],
[ 6., 2., 4., 1.]])
'''
#要合并多个矩阵或者序列时,则用concatenate会更方便
a=np.array([1,2,3]).reshape(3,1)
b=np.array([4,5,6]).reshape(3,1)
np.concatenate((a,b,b,a),axis=0) # axis=0 表示按第0维,也就是行堆叠纵向合并
'''
array([[1],
[2],
[3],
[4],
[5],
[6],
[4],
[5],
[6],
[1],
[2],
[3]])
'''
np.concatenate((a,b,b,a),axis=1) # axis=1 表示按第一维,也就是列堆叠横向合并
'''
array([[1, 4, 4, 1],
[2, 5, 5, 2],
[3, 6, 6, 3]])
'''
3.数组分割
split:指定分割维度,沿固定轴分割数组
语法格式:numpy.split(ary, indices_or_sections, axis)
ary:分割数组
indices_or_sections:可以是整数,表明要从输入数组创建的,等大小的子数组的数量,将数组进行等量分割。 如果此参数是一维数组,则其元素表明要创建新子数组的点。
axis:分割维度
hsplit:横向按列分割
语法格式:numpy.hsplit(ary, indices_or_sections)
ary:分割数组
indices_or_sections:可以是整数,表明要从输入数组创建的,等大小的子数组的数量,将数组进行等量分割。 如果此参数是一维数组,则其元素表明要创建新子数组的点。
vsplit:纵向按行分割
语法格式:numpy.vsplit(ary, indices_or_sections)
ary:分割数组
indices_or_sections:可以是整数,表明要从输入数组创建的,等大小的子数组的数量,将数组进行等量分割。 如果此参数是一维数组,则其元素表明要创建新子数组的点。
a=np.arange(12).reshape((3,4))
np.split(a,3,axis=0)#将a数组a按行分成三份
#同 np.vsplit(a,3)
'''
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
'''
np.split(a,2,axis=1)#将a按列分成2半,每部分2列
#同 np.vsplit(a,3)
#同 np.
'''
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
'''
np.split(a,(1,2,3),axis=1)#在第一列 第二列 第三列位置进行分割
#同 np.vsplit(a,(1,2,3))
'''
[array([[0],
[4],
[8]]), array([[1],
[5],
[9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
'''
4.数组复制
复制分浅复制与深度复制
浅复制:是使几个变量指向同一个指针,因此这几个变量中的一个改变,其余的几个也会跟着改变
[:]
使用数组切片方式,将得到的结果赋值给新元素
如:
a=np.arange(4)
#array([0, 1, 2, 3])
b=a # a,b变量指向同一个地址
a[0] = 1
print(b)
#array([1, 1, 2, 3])
a=np.arange(9).reshape((3,3))
'''
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
'''
c=a[0:1,:]
'''
array([[0, 1, 2],
[3, 4, 5]])
'''
a[0,0] = 100
print(c)
'''
[[100 1 2]
[ 3 4 5]]
'''
深复制:是将一个变量的值赋给另一个变量,两者指向不同的指针,只是值相同。
copy
语法格式:
数组b=numpy.copy(arr)
arr:数组名称
如:
a=np.arange(9).reshape((3,3))
'''
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
'''
d = np.copy(a)
a[0,0] = 100
print(d)
'''
array([[100, 1, 2],
[3, 4, 5],
[6, 7, 8]])
'''
print(a)
'''
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
'''
2262



被折叠的 条评论
为什么被折叠?



