2 ndarray
首先,数组
1、这是啥:N维数组对象:N dimensions array
2、人话:结构特殊的矩阵
3、表示特点:总是套上array()
4、数据特点:同构(同类型)
创建
np.array函数
作用:将Python原生序列对象转变为ndarray
#例如一个列表的转化
word1=[1,2,3,4]
arr1=np.array(word1)
#嵌套列表转多维
word2=[[1,2,3,4],[5,6,7,8]]
arr2=np.array(word2)
注意:格式识别,此函数会尝试推断合适的格式,一般是浮点
具体而言,完整np.array函数为:
np.array(序列,dtype=np.格式)
格式即为python自带的原生格式,例如浮点数即为float64
查看格式
arr1.dtype
赋予数组新的格式
arr1.astype(np.格式)
其他函数
了解作用即可,用到的时候再查询
#创建一个顺序数组
np.arange(数字)
#创建a维b列0数组
np.zeros((a,b))
#创建a嵌套b维c列0数组
np.zeros((a,b,c))
#创建5行4列随机数矩阵
arr2=np.random.randn(5,4)
注意区分zeros和empty
运算
比较简单,基于线代的矩阵运算,不多提(忘了可查高等代数)
索引切片
什么玩意
索引:找到数组中的某个元素的过程
切片:横截面数据型的索引(冒号)
特别之处,这不是R里面的重新生成一个变量,而是一种投射,对此投射的修改会影响整体
那可…太惊讶了,这真的很方便吗?
如果想使用传统(R)意义的切片,使用如下代码:
arr1[3:9].copy()
如何使用
与R语言极其相似的调取方法(包括方括号冒号的用法)
基本索引切片
- 不同于R,这里计数是从0开始的;a:b的意思是a到b-1
- 高维数组取值(以二维为例),两种表示都行
- 单独加:号即表示选取全体,:n表示到n-1为止之前全体,n:表示n与n之后全体
#从第一维选取第二个元素 arr2d[0][2] arr2d[0,2]
布尔型索引
一个恰当长度的布尔型数组可以用于切片索引
- 布尔型数组
#一个典型的布尔型数组
array([True,False,False,True,False])
如何生成布尔型数组:利用逻辑判断
#利用逻辑判断生成布尔数组,names为一个ndarray
names=='Bill'
提高效率:将生成选取一步完成
data[names!='Bill',a:b]
#a:b作用是对选取后的数组内元素进一步筛选
注意是数组每个维的内部元素,此时将数组整体视为矩阵更好理解(也是这里的本意)
常见应用:将data中负值均转化为0
data[data < 0]=0
#a:b作用是对选取后的数组内元素进一步筛选
这里用到了广播的原理,一个等式,全部改掉
花式索引
定义:利用整数数组进行索引
特点:数组不仅包含了索引对象,还暗含了索引顺序
转置
#完成对矩阵arr的转置
arr.T#一般而言的矩阵
对于复杂高位矩阵,转置需要制定各个轴的具体位置,以后遇到了可以百度
相关函数
提一个经常生成矩阵的arrange函数
#np.arange([start, ]stop, [step, ]dtype=None)
#生成半开区间的值,stop值是要有的
arr.T#一般而言的矩阵
根据实际的使用需求使用
如何应用于数据处理
这个地方好处和R的dplyr是一样的,它可以直接矢量化操作,节省了写循环的时间以及耗费的资源
np.where
三元表达式x if cond else y的矢量化(三者一般都是ndarray)
np.where(cond,xarr,yarr)
#当cond为真,选取xarr,为假,选取(执行)yarr
#xarr与yarr可以为标量
#cond可以是逻辑判断(因为逻辑判断可以生成布尔型数组)
条件还可以嵌套(cond本身是两种条件的交集即可)
np.where(c1&c2,0,np.where(c1,1,np.where(c2,2,3)))
#为了理解上的方便,可以等同于excel里面的if语句的嵌套
np.stat.
stat.指的是一系列的聚合计算函数(想起了被sql聚类支配的恐惧)
需要注意的是一些函数选项
import numpy as np
arr2=np.random.randn(5,4)
print(arr2)
print(arr2.mean())#所有元素均值
print(arr2.mean(axis=0))#每列均值
print(arr2.mean(axis=1))#每行均值
#利用布尔数组判断原数组大于零的数量
arr1=arr2=np.random.randn(5,5)
print(arr1)
#两种表达均可计数
print((arr1>0).sum())
print(np.sum((arr1>0)))
补充:保留小数位的方法:np.around与np.set_printoptions
import numpy as np
arr3=np.random.randn(5,5)
print(arr3)
#设置小数位置为3位
print(np.around(arr3,3))
np.set_printoptions(precision=3)
print(arr3)
np.sort
此函数不会返回值:这意味着它是在原变量上操作的,注意注意
#ndarray.sort()仅仅修改原来变量
arr4=np.random.randn(3,3)
print(arr4)
#默认axis=1按行排序(可以不写,axis=可以省略),0按列排序(-1最后一个维度)
print(arr4.sort(0))#此时会报None
arr4.sort(0)
print(arr4)
#np.sort生成一个copy
arr5=np.random.randn(3,3)
print(arr5)
#语法无效
np.sort(arr5,axis=1)
print(arr5)
#语法有效
print(np.sort(arr5,axis=1))
np.unique与np.in1d
都属于“匹配-寻找”概念的函数
前者返回distinct值,后者根据数组a查询数组b的成员资格
#查找arr6中arr7元素的情况
arr6=np.array([1,2,3,4,5,6])
arr7=np.array([1,4,6,6])#重复值不影响
print(np.in1d(arr6,arr7))
#out:[ True False False True False True]