一、numpy的ndarray:一种多维数组对象
1. 创建nadrray
属性:
arr.nidm:维度
arr.shape:维度大小
arr.dtype:数值类型表达规则:
np.函数(列表或元祖)
1.np.array(列表或者元祖);array函数:接受一切序列型的对象:
2.np.zeros(数值或者元祖);zeros函数:创建指定长度全0数组
3.np.ones(数值或者元祖);ones函数:创建指定长度全1数组
4.np.arange(数值)#后面一定跟数值
#一维数组:np.arange(12)
#二维数组:np.arange(12).reshape(3,4)
注:以上创建函数后是列表或者数值即为一维数组;是元祖即为二维数组
#列表转化为一维数组
data1=[6,7.8,8,0,1]
arr1=np.array(data1)
arr1
array([6. , 7.8, 8. , 0. , 1. ])
#嵌套列表转化为多维数组
data2=[[1,2,3,4],[5,6,7,8]]
arr2=np.array(data2)
arr2
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
#arange函数
data3=np.arange(12)
1. 直接设置数据类型
arr1=np.array([1,2,3,4],np.float64)
2. 转化数据类型:astype
int_arr1=arr1.astype(np.int64)
3. 传递数据属性
int_array=np.arange(10) ; cailbers=np.array([.1,.2,.3,.4],np.float64)
int_array.astype(cailbers.dtype)
笔记:调用astype总会创建一个新的数组(一个数据的备份),即使新的dtype与旧的dtype相同
3.NumPy数组的运算
1. 大小相等的数组之间的任何算术运算都会将运算应用到元素级:
2. 数组与标量的算术运算会将标量值传播到各个元素:
3. 大小相同的数组之间的比较会生成布尔值数组:
4.基本的索引和切片
1. 一维数组:类似于Python
arr[2];arr[3:6];
arr[3:6]=12#该层意思是将12这个值广播到第四个数到第六个数,该范围内的数值均为12
#跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上。
arr=np.arange(10)
arr_slice=arr[3:6]#取一切片
arr_slice[1]=78#更改切片中的某个数据
arr#切片是原始数据的视图,切片视图改变数据,原始数据也被改变
array([ 0, 1, 2, 3, 78, 5, 6, 7, 8, 9])
#更改全部切片
arr_slice[:]=12
#注意:如果你想要得到的是ndarray切片的一份副本而非视图,就需要明确地进行复制操作,例如
arr[5:8].copy()。
2. 二维数组:
#索取某一行:arr[2]
#索取某一行某一列的具体数值:
arr[2][1]
arr[2,1]
两者是等价的
3.多维数组n
#索取某个n-1维数组:arr[1]
#索取某个n-2为数组:arr[1][0]
---------
arr=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
arr[0]
array([[1, 2, 3],
[4, 5, 6]])
arr[0,1]
array([4, 5, 6])
arr[0,1,2]
6
5.切片索引
1、一维数组:和python列表差不多
2、二维数组:看下图
3、切片赋值:arr[:2,1:]=0,图片中数字被赋值0
6.布尔型索引
布尔型索引就是将用True和False来判定符合条件的
1. 一维数组:names=="Bob"-->布尔型数组
2. 二维数组:一般结合一维数组进行判定。 data[name=="Bob"]
#但是前提必须是:布尔型数组的长度必须跟被索引的轴长度一致。
3. 布尔型数组和切片、整数(或整数序列)混合使用:data[name=="Bob", 2:]
data[name=="Bob", 3]
4. 不等于(!=)或者~: data[~(names=="Bob")]
5. ~是反转条件
6. 组合应用多个布尔条件:使用&、|之类的布尔运算符,但是不能使用and和or
7. mask=(names=="Bob")|(names=="will") --> data[mask]
8. 布尔类型赋值:data[data<0] =0
data[names != "Joe"] =7
通过布尔型索引选取数组中的数据,将总是创建数据的副本,即使返回一模一样的数组也是如此。
注意:Python关键字and和or在布尔型数组中无效。要是用&与|。
7.花式索引
#花式索引(Fancy indexing)是一个NumPy术语,它指的是利用整数数组进行索引。
1. 为了以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray即可
2. 方案一:arr[ [4,3,0,6] ] 里面传入的是一个一维数组,这一维数组里面包括索引值。
3. 方案二:arr[ [1,5,7,2],[0,3,1,2] ] 得到的是一个一维数组,最终选出的是元素(1,0)、(5,3)、(7,1)和(2,2)。无论数组是多少维的,花式索引总是一维的。
4. 方案三:如果要得到上述选取1,5,7,2行数据,又进行重新排序
arr[ [1,3,5,7] ] [ : , [0,3,1,2] ]
#用np.empty法构造二维数组
arr=np.empty((8,4))
for i in range(8):
arr[i]=i
array([[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[6., 6., 6., 6.],
[7., 7., 7., 7.]])
#取行
arr[[-3,-5,-7]]
array([[5., 5., 5., 5.],
[3., 3., 3., 3.],
[1., 1., 1., 1.]])
#取对应的一维数组
arr[[1,5,7,2],[0,3,1,2]]
array([1., 5., 7., 2.])
#最终选出的是元素(1,01)、(5,3)、(7,1)和(2,2)。无论数组是多少维的,花式索引总是一维的。
#取某几行的某几列
arr[[1,5,7,2]][:,[0,3,1,2]]
array([[1., 1., 1., 1.],
[5., 5., 5., 5.],
[7., 7., 7., 7.],
[2., 2., 2., 2.]])
8.数组转置和轴对换
1. 转置:转置是重塑的一种特殊形式,它返回的是源数据的视图(不会进行任何复制操作)。
2. arr.T
3. 高维数组:在进行矩阵计算时,经常需要用到该操作,比如利用np.dot计算矩阵内积:np.dot(arr.T,arr)
4.arr=np.arange(16).reshape((2,2,4))
arr.transpose((1,0,2)):
第一个轴被换成了第二个,第二个轴被换成了第一个,最后一个轴不变。
二、通用函数:快速的元素级数组函数
通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。你可以将其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。
1.一元函数:np.abs(data)
2.二元函数:np.add(data1,data2)
三、利用数组进行数据处理
将条件逻辑表述为数组运算
方法一:(x if c else y)
方法二:np.where(c,x,y)
#方法一:学习此方法中的for in zip
xarr=np.array([1,2,3,4,5])
yarr=np.array([6,7,8,9,10])
cond=np.array([True, False,True,True,False])
result=[(x if c else y)
for x, y, c in zip(xarr, yarr, cond) ]
result
[1, 7, 3, 4, 10]
方法二:np.where(c,x,y)三元函数
arr=np.random.randn(4,4)
arr
np.where(arr>0,2,-2)
array([[-2, -2, 2, 2],
[-2, -2, -2, 2],
[ 2, -2, -2, -2],
[ 2, 2, 2, 2]])
arr.sum()—–>np.sum()
arr.mean()—–>np.mena()
arr.sum(axis=0/1)—–>np.sum(axis=0/1)
3.用于布尔型数组的方法
arr=np.random.randn(100)
(arr>0).sum()#arr>0是布尔数组
bools=np.array([False, False, True, False])
bools.any()#对数组里面含有1个及以上的返回True
bools.all()#对数组里面全部含有True的返回True
4.排序
一维数组:arr.sort()
二维数组:arr.sort(axis=0/1)
高级:np.sort(arr)
5.唯一化以及其他的集合逻辑
唯一化:np.unique(names)
测试一个数组中的值在另一个数组中的成员资格,返回布尔型数组:np.in1d(arr_需要判定的数组,[2,3,5])#两个参数:第一个需要判定的数组,第二个是判定的条件
values=np.array([6,0,0,3,2,5,6])
np.in1d(values,[2,3,5])
array([False, False, False, True, True, True, False])
四、用于数组的文件输入输出
np.save("some_arr",arr)
np.load("some_arr.npy")
五、线性代数
x.dot(y)
np.dot(x,y)
[email protected](3)
以上三者都是等价的
六、随机数生成
七、随机漫步