- 数组的转置和换轴
#(1)对于二维数组而言,可以直接用T属性对换行列,得到原数据的拷贝
import numpy as np
arr=np.arange(12).reshape(3,4)
arr.T
#(2)对于更高维度的数组,可以用transpose方法进行转置,得到原数据的拷贝
arr_1=np.arange(24).reshape(2,3,4)
arr_1.transpose(1,0,2)
'''
array([[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 8, 9, 10, 11],
[20, 21, 22, 23]]])
'''
'''
transpose方法中的参数相当于是shape的索引,shape原先的索引是(0,1,2)现在相当于把第一个维度和第二个维度进行了交换。
比如1这个元素,原来的维度是(0,0,1),转置后仍然是(0,0,1),位置不变
再比如4这个元素,原来的维度是(0,1,0),转置后是(1,0,0),所以最后的位置在第一维度(0,0)的位置。
'''
#(3)swapaxes函数接受一对轴编号作为参数,将两个轴互换,得到原数据的视图
arr_1.swapaxes(0,1)
array([[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 8, 9, 10, 11],
[20, 21, 22, 23]]])
- 条件逻辑作为数组操作
之前有提到过列表推导式
[expr for val in collection if condition]
对数组的操作也可以通过列表推导式
#挑选a,b中数值大的元素组成新的列表
a=np.random.randn(6)
a
'''
array([-0.12981609, -0.08394044, 0.11156267, 0.12579888, 0.31244508, 1.56267388])
'''
b=np.random.randn(6)
b
'''
array([-1.92307751, -0.962841 , 1.21632673, -1.01466381, -1.22601677, 0.91981704])
'''
c=a>b
c
'''
array([ True, True, False, True, True, True])
'''
result=np.array[(a1 if c1 else b1) for a1,b1,c1 in zip(a,b,c)]
'''
array([-0.12981609, -0.08394044, 1.21632673, 0.12579888, 0.31244508, 1.56267388])
'''
这种推导式在数组很大时会占用很大内存,并且对于多维数组不奏效。
上述的代码也可以用np.where实现,np.where(condition,[x,y])
result=np.where(c,a,b)
#相当于判断c中每个元素是否为True,如果True则选取a中的元素,False选取b中的元素,最后组成和c形状相同的数组
#如果c为多维数组
np.where([[True,False], [True,True]],[[1,2], [3,4]],[[9,8], [7,6]])
'''
array([[1, 8],
[3, 4]])
'''
#其实相当于先用了3个数组用了zip函数,组成了[[(True,1,9),(False,2,8)],[True,3,7],[True,4,6]],索引为(0,0)的元素,因为条件为True,所以选择了1
#用法中的x和y均为可选变量,并且变量类型可以为数组,也可以为标量
a
#array([-0.12981609, -0.08394044, 0.11156267, 0.12579888, 0.31244508, 1.56267388])
np.where(a>0)
# (array([2, 3, 4, 5], dtype=int64),) 返回的是a中符合条件的索引
a[np.where(a>0)]
# array([0.11156267, 0.12579888, 0.31244508, 1.56267388])
#相当于a[a>0]
np.where(a>0,2,-2) #对>0的元素赋值为2,<0赋值为-2
#array([-2, -2, 2, 2, 2, 2])
- 数组统计方法
对数组进行统计运算时,可以使用数组的方法,也可以用numpy内置函数。
a.mean() #调用数组方法
np.mean(a) #调用numpy内置函数
除了对全部元素进行计算外, 可以指定特定的轴
dimension2=np.random.randn(2,4)
dimension2
'''
array([[-0.08200293, 2.11290504, 0.95584747, -0.50603455],
[ 1.40965591, -1.66446611, -0.26237453, -0.04456781]])
'''
np.mean(dimension2,axis=0)
'''array([ 0.66382649, 0.22421947, 0.34673647, -0.27530118])''''
#axis=0是行轴向,axis=1是列轴向
dimension2.sum(1)
#array([ 2.48071503, -0.56175254])
arr1=np.random.randn(2,4)
arr1.sort(axis=1) #返回对原数据的拷贝
np.sort(arr1,axis=1) #返回原数据的视图
布尔数组还有很多很好的用法
arr=np.random.randn(100)
(arr>0).sum() #55 统计其中True的数量
bools=np.array([True,False,False])
bools.any() #True 判断是否含有True
bools.all() #False 判断是否均为True
如果是非布尔数组,所有的非0元素均为True
- 数组的集合操作
针对一维的数组,有一些基础的集合操作
arr2=np.array(['a','c','ab','e','a','b','ef'])
np.unique(arr2)
#array(['a', 'ab', 'b', 'c', 'e', 'ef'], dtype='<U2') 返回数组中的唯一值并且经过排序
#等价于
sorted(set(arr2))
values=np.array([6,0,0,3,2,5,6])
np.in1d(values,[2,3,6])
#array([ True, False, False, True, True, False, True])
#逐一比较前者列表/数组中的元素是否在另外一个数组中/列表中,并返回布尔值数组
np.intersect1d(values,[2,3,6])
#array([2, 3, 6]) 取交集并排序
np.in1d(values,[2,3,6])
# array([ True, False, False, True, True, False, True]) 是否为包含关系
np.union1d(values,[2,3,6])
#array([0, 2, 3, 5, 6]) 取并集并排序
网友评论