数组转置和轴对换
数组的转置(transpose)是很常见的一种矩阵变换,numpy数组实现转置的方式有两种,一种是使用数组的T属性,另一种是使用numpy中定义的 transpose方法。
T属性的用法很简单,一个T属性就能使得矩阵的轴交换,
对于高维数组,使用transpose方法需要得到由轴编号组成的元组。
这两个方法返回的都是视图,而不是复制的副本。
通用函数
以下介绍的函数都是元素级的函数,
1)一元函数
# 各元素绝对值
np.fabs(-1) # 返回 1.0
np.fabs([-1.2, 1.2]) # 返回 array([ 1.2, 1.2])
# 各元素的平方
np.square([-1j, 1]) # 返回 array([-1.-0. j, 1.+0. j]) 蓝色标记实部,红色标记虚部
各元素的平方根和 exp
对数函数使用
np.log([1, np.e, np.e**2, 0]) # 返回array([ 0., 1., 2., -Inf]),默认的log是自然底数e,即 ln
# 同样是计算 ln(1+x)两个方法得到的结果是不同的,log直接计算会有误差
np.log1p(1e-99) # 返回1e-99,log1p计算的是 log(1+x)的值,即 ln(1+x)
np.log(1 + 1e-99) # 返回 0.0
x = np.array([0, 1, 2, 2**4])
np.log2(x) # 返回 array([-Inf, 0., 1., 4.]),计算 log2
np.log10([1e-15, -3.]) # 返回array([-15., NaN]),计算 log10
ln(1+x)使用泰勒展开,
f(x)= f(0)+ f′(0)x+ f″(0)x ²/ 2!+…+ fⁿ(0)… f(x)= ln(x+1) f(0)=ln1=0
可见,log的一系列方法计算传入的值可以是列表、数值和数组。
2)二元函数
#add的使用,The sum of x1 and x2, element-wise. Returns a scalar(标量) if both x1 and x2 are scalars.
np.add(1.0, 4.0) #返回 5.0,两个都是标量则返回标量
x1 = np.arange(9.0).reshape((3, 3)) # 返回 array([[ 0., 1., 2.],
# [ 3., 4., 5.],
# [ 6., 7., 8.]])
x2 = np.arange(3.0) # 返回 array([ 0., 1., 2.])
np.add(x1, x2) # 返回 array([[ 0., 2., 4.],
[ 3., 5., 7.],
[ 6., 8., 10.]])
#substract使用,The difference of x1 and x2, element-wise. Returns a scalar if both x1 and x2 are scalars.
np.subtract(1.0, 4.0) # 返回 -3.0,两个都是标量则返回标量
x1 = np.arange(9.0).reshape((3, 3))
x2 = np.arange(3.0)
np.subtract(x1, x2) # 返回 array([[ 0., 0., 0.],
# [ 3., 3., 3.],
# [ 6., 6., 6.]])
#multiply使用
np.multiply(2.0, 4.0) # 返回 8.0,两个都是标量则返回标量
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.]])
#divide使用
np.divide(2.0, 4.0) #返回 0.5
x1 = np.arange(9.0).reshape((3, 3))
x2 = np.arange(3.0)
np.divide(x1, x2) # 返回 array([[ NaN, 1. , 1. ],
# [ Inf, 4. , 2.5],
# [ Inf, 7. , 4. ]])
#power使用
# 传入一组基,和一个值
x1 = range(6) #返回 [0, 1, 2, 3, 4, 5]
np.power(x1, 3) #返回 array([ 0, 1, 8, 27, 64, 125])
# 传入两组基,两组基必须是相同的空间复杂度
x2 = [1.0, 2.0, 3.0, 3.0, 2.0, 1.0]
np.power(x1, x2) #返回 array([ 0., 1., 8., 27., 16., 5.])
# 传入一组基和一个数组
x2 = np.array([[1, 2, 3, 3, 2, 1], [1, 2, 3, 3, 2, 1]])
# 返回 array([[1, 2, 3, 3, 2, 1],
# [1, 2, 3, 3, 2, 1]])
np.power(x1, x2)
# 返回 array([[ 0, 1, 8, 27, 16, 5],
# [ 0, 1, 8, 27, 16, 5]])
# 传入两个数组(形状必须相同)
l = np.array([[1, 2, 3, 3, 2, 1], [1, 2, 3, 3, 2, 1]])
# 返回 array([[1, 2, 3, 3, 2, 1],
# [1, 2, 3, 3, 2, 1]])
m = np.array([[1, 2, 4, 0, 2, 1], [1, 2, 3, 5, 10, 1]])
# 返回 array([[ 1, 2, 4, 0, 2, 1],
# [ 1, 2, 3, 5, 10, 1]])
np.power(l,m)
# 返回 array([[ 1, 4, 81, 1, 4, 1],
# [ 1, 4, 27, 243, 1024, 1]])
max和min方法,只演示max,min同理
mod方法
greater、logical_end方法,
If the inputs are ndarrays, then np.greater is equivalent to ‘>’.
np.greater([4,2],[2,2]) # 返回 array([ True, False], dtype=bool)
#当两个参数都是数组时候,相当于 > 符号
a = np.array([4,2])
b = np.array([2,2])
a > b # 返回 array([ True, False], dtype=bool)
#logical_and方法
#传入两个布尔值
np.logical_and(True, False) # 返回 False
#传入两个布尔型数组
np.logical_and([True, False], [False, False]) #返回 array([False, False])
#用于对一个数组添加条件,参数是两个对数组的判断
x = np.arange(5)
np.logical_and(x>1, x<4) #返回 array([False, False, True, True, False])
数组排序
数组的排序使用的是 sort方法,
a = np.array([[1,4],[3,1]]) # array([[1, 4],
# [3, 1]])
np.sort(a)
# 返回 array([[1, 4],
# [1, 3]]) sort along the last axis,默认是最后一个轴进行排序
#axis参数使用
np.sort(a, axis=None) # 返回 array([1, 1, 3, 4]) axis参数为None时候,将多维数组转为一维
np.sort(a, axis=0) # 返回 array([[1, 1],
# [3, 4]]) 也可以指定按照其他的轴进行排序
#order参数使用
dtype = [('name', 'S10'), ('height', float), ('age', int)]
values = [('Arthur', 1.8, 41), ('Lancelot', 1.9, 38),('Galahad', 1.7, 38)]
a = np.array(values, dtype=dtype) # create a structured array,这个数组相当于有字段名
np.sort(a, order='height')
# 返回 array([('Galahad', 1.7, 38),
# ('Arthur', 1.8, 41),
# ('Lancelot', 1.8999999999999999, 38)],
# dtype=[('name', '|S10'), ('height', '<f8'), ('age', '<i4')])
# Sort by age, then height if ages are equal,这里相当于设定了sort的顺序
np.sort(a, order=['age', 'height'])
# 返回 array([('Galahad', 1.7, 38),
# ('Lancelot', 1.8999999999999999, 38),
# ('Arthur', 1.8, 41)],
# dtype=[('name', '|S10'), ('height', '<f8'), ('age', '<i4')])
sort方法返回的是副本,而不是视图。
一维数组方法
numpy的 unique方法,返回的是去重复后且经过排序的数组,
np.in1d方法,
intersect1d、union1d和 setdiff1d方法,
#传入列表或者数组都行
np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1]) #返回 array([1, 3])
a = np.array([1, 2, 3, 2, 4, 1])
b = np.array([3, 4, 5, 6])
np.setdiff1d(a, b) #返回 array([1, 2])
setxor1d方法,
a = np.array([1, 2, 3, 2, 4])
b = np.array([2, 3, 5, 7, 5])
np.setxor1d(a,b) #返回 array([1, 4, 5, 7])
合并numpy数组使用 concatenate方法,
concatenate方法可以同时合并两个以上的numpy数组。
布尔型数组方法
布尔型数组的true和false有时能被转换为 1和0。比如sum方法就是对布尔型数组中的True进行计数的方法。
还有两个方法any和all,两个方法都是用于判断,返回值是布尔值。其中,any用于判断布尔型数组中是否存在True;all则是判断布尔型数组中的元素是否都是True。