ndarray.dtype
描述数组中元素类型的对象。可以使用标准Python类型创建或指定dtype。另外,NumPy提供了自己的类型。numpy.int32,numpy.int16和numpy.float64是一些示例。
import numpy as np ary = np.array([1, 2, 3, 4, 5, 6]) print(type(ary), ary, ary.dtype) #转换ary元素的类型 b = ary.astype(float) print(type(b), b, b.dtype) #转换ary元素的类型 c = ary.astype(str) print(type(c), c, c.dtype)
ndarray.itemsize
数组中每个元素的大小(以字节为单位)。例如,类型为元素的数组float64具有itemsize8(= 64/8),而类型complex32中的一个具有itemsize4(= 32/8)。等同于ndarray.dtype.itemsize。
import numpy as np a = np.arange(15).reshape(3, 5) array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) a.itemsize
d.自定义复合类型
# 自定义复合类型 import numpy as np data=[ ('zs', [90, 80, 85], 15), ('ls', [92, 81, 83], 16), ('ww', [95, 85, 95], 15) ] #第一种设置dtype的方式 a = np.array(data, dtype='U3, 3int32, int32') print(a) print(a[0]['f0'], ":", a[0]['f1']) print("=====================================") #第二种设置dtype的方式 b = np.array(data, dtype=[('name', 'str_', 2), ('scores', 'int32', 3), ('age', 'int32', 1)]) print(b[0]['name'], ":", b[0]['scores']) print("=====================================") #第三种设置dtype的方式 c = np.array(data, dtype={'names': ['name', 'scores', 'ages'], 'formats': ['U3', '3int32', 'int32']}) print(c[0]['name'], ":", c[0]['scores'], ":", c.itemsize) zs : [90 80 85] : 15 28 # 元素字节数 print("=====================================") #第四种设置dtype的方式 d = np.array(data, dtype={'name': ('U3', 0), 'scores': ('3int32', 16), 'age': ('int32', 28)}) print(d[0]['names'], d[0]['scores'], d.itemsize) print("=====================================") #测试日期类型数组 f = np.array(['2011', '2012-01-01', '2013-01-01 01:01:01','2011-02-01']) ['2011' '2012-01-01' '2013-01-01 01:01:01' '2011-01-01'] f = f.astype('M8[D]') ['2011-01-01' '2012-01-01' '2013-01-01' '2011-01-01'] f = f.astype('i4') [14975 15340 15706 14975] print(f[3]-f[0]) 0 f.astype('bool') array([ True, True, True, True])
6.数组索引和切片
a.索引操作
一般索引:
import numpy as np array01=np.arange(1,10) array01[5]#索引 list02=[[1,2,3,4,5],[7,8,9,10,11],[12,34,6,6,8]] array03=np.array(list02) array03[0,3]#索引
高级索引:NumPy 比一般的 Python 序列提供更多的索引方式。除了之前看到的用整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引。
b.一维数组切片操作
数组对象切片的参数设置与列表切片参数类似
步长+:默认切从首到尾
步长-:默认切从尾到首
数组对象[起始位置:终止位置:步长, …]
默认位置步长:1
import numpy as np a = np.arange(1, 10) print(a) print(a[:3]) print(a[3:6]) print(a[6:]) print(a[::-1]) print(a[:-4:-1]) print(a[-4:-7:-1]) print(a[-7::-1]) print(a[::]) print(a[:]) print(a[::3]) print(a[1::3]) print(a[2::3])
c.多维数组的切片操作
数组对象[页号, 行号, 列号],下标从0开始,到数组len-1结束。
import numpy as np a = np.arange(1, 28).reshape(3,3,3) print(a) #切出1页 print(a[1, :, :]) #切出所有页的1行 print(a[:, 1, :]) #切出0页的1行1列 print(a[0, :, 1])
练习:
import numpy as np a = np.arange(10) print(a[2:7:2]) print(a[2],a) print(a[2:]) t1 = np.arange(24).reshape(4,6) print(t1) print('*'*20) print(t1[1]) print(t1[1,:]) print(t1[1:]) print(t1[1:3,:]) print(t1[[0,2,3]]) print(t1[[0,2,3],:]) print(t1[:,1]) print(t1[:,1:]) print(t1[:,[0,2,3]]) print(t1[2,3]) print(t1[[0,1,1],[0,1,3]])
7.数组的操作
注意: 要结合学习。 我对numpy的笔记大部分只是仅限于框架引领作用,不可能做到面面俱到,所以语法细节大部分要去对比菜鸟笔记以及numpy官网(百度numpy即可,注意使用谷歌浏览器可以即时翻译)结合学习。
a.形状操作
numpy.shape()、numpy.resize()、numpy.flatten()、numpy.reshape()、numpy.ravel()
**ndarray的形状:** four = np.array([[1,2,3],[4,5,6]]) # shape修改的是原有的 four.shape = (3,2) four # reshape返回一个新的数组 four = four.reshape(3,2) four # 将多维变成一维数组 five = four.reshape((6,),order='F') # 默认情况下参数order=‘C’以行为主的顺序展开,‘F’(Fortran风格)意味着以列的顺序展开 six = four.flatten(order='F') five six # 拓展:数组的形状 t = np.arange(24) t t.shape # 转换成二维 t1 = t.reshape((4,6)) t1 t1.shape # 转成三维 t2 = t.reshape((2,3,4)) t2 t2.shape **视图变维(数据共享):** reshape() 与 ravel() import numpy as np a = np.arange(1, 9) print(a) # [1 2 3 4 5 6 7 8] b = a.reshape(2, 4) #视图变维 : 变为2行4列的二维数组 print(b) [[1 2 3 4] [5 6 7 8]] c = b.reshape(2, 2, 2) #视图变维 变为2页2行2列的三维数组 print(c) [[[1 2] [3 4]] [[5 6] [7 8]]] d = c.ravel() #视图变维 变为1维数组 print(d) [1 2 3 4 5 6 7 8] **复制变维(数据独立):**flatten() e = c.flatten() print(e) [1 2 3 4 5 6 7 8] a += 10 print(a, e, sep='\n') [11 12 13 14 15 16 17 18] [1 2 3 4 5 6 7 8] # 比较 ndarray.shape, reshape, resize, ravel **就地变维:直接改变原数组对象的维度,不返回新数组** a.shape = (2, 4) print(a) [[11 12 13 14] [15 16 17 18]] a.resize(2, 2, 2) print(a) [[[11 12] [13 14]] [[15 16] [17 18]]]
以下代码是看视频写在jupyter notebook上的代码。
import numpy as np array01=np.arange(32) array01 array01.shape array01.ndim #就地变维:直接改变原数组对象的维度,不返回新数组 array01.shape=(1,32) array01 array01.shape=(2,16) array01 array01.shape=(4,8) array01 array01.shape=(32,1) array01 array01.shape=(2,4,4) array01 #就地变维:等同于上面。 array01.resize(2,4,4) array01 #复制变维:两个内存地址,数据独立 array02=array01.flatten() array02 print(id(array01)) print(id(array02)) #视图变维(表面上看是一个4行8列的,但是本质上来说, #他并没改变,只是视图上的变维,本质是没有任何改变) array02.reshape(4,8) array02 array03=array02.reshape(4,8) array03 print(id(array03)) print(id(array02)) #raval() array03=array02.reshape(4,8) array03 array03.shape array03.ndim np.ravel(array03,order="C") np.ravel(array03,order="F") array03
b.数组数值的修改和添加元素
numpy.reshape()
numpy.append()
#1. numpy.append
numpy.append(arr, values, axis=None)
函数在数组的末尾添加值。追加操作会分配整个数组,并把原来的数组复制到新数组中。此外,输入# 数组的维度必须匹配否则将生成ValueError。
‘’’
参数说明:
arr:输入数组
values:要向arr添加的值,需要和arr形状相同(除了要添加的轴)
axis:默认为 None。
当axis无定义时,是横向加成,返回总是为一维数组!
当axis有定义的时候,分别为0和1的时候(列数要相同)。
当axis为1时,数组是加在右边 (行数要相同)。
‘’’
a = np.array([[1,2,3],[4,5,6]]) a #向数组添加元素: np.append(a, [7,8,9]) #沿轴 0 添加元素 np.append(a, [[7,8,9]],axis = 0) #、 沿轴 1 添加元素: np.append(a, [[5,5,5],[7,8,9]],axis = 1)
numpy.insert()
numpy.insert(arr, obj, values, axis) # 函数在给定索引之前,沿给定轴在输入数组中插入值。 # 如果值的类型转换为要插入,则它与输入数组不同。插入没有原地的,函数会返回一个新数组。此外,如果未提供轴,则输入数组会被展开。 a = np.array([[1,2],[3,4],[5,6]]) a # 未传递 Axis 参数。 在插入之前输入数组会被展开 np.insert(a,3,[11,12]) # 传递了 Axis 参数。 会广播值数组来配输入数组 # 沿轴0 np.insert(a,1,[11],axis = 0) # 沿轴1 np.insert(a,1,11,axis = 1)
这段代码是参考上述视频编写的学习代码
import numpy as np t=np.arange(24).reshape(4,6) t #整数的索引和切片 t[1,2]=800 t t[0:2,0:2] #整数数组索引 t[[0,1,2],[0,1,3]]=500 t #布尔索引 t[t>15]=1500 t #花式索引 t[t>15]=1500 t #数组数值的修改 t[1,:]=0 t t[:,1]=0 t t[1:3,:]=0 t t[:,1:4]=0 t t[1:4,2:5]=0 t t[[0,1],[0,3]]=0 t #数组添加元素;append()添加 array02=np.arange(24).reshape(4,6) array02 array03=np.append(array02,25) array03 print(id(array02)) print(id(array03)) array04=np.arange(6) array03=np.append(array02,array04)#没有axis就直接拉平 array03 array04=np.arange(6) array04 array04=np.arange(6).reshape(1,6) array04 array03=np.append(array02,array04,axis=0)#以行为标准 array03 array04=np.arange(4).reshape(4,1) array04 array03=np.append(array02,array04,axis=1)#以列为标准 array03 #insert添加 array02 array04=np.arange(4) array04 array05=np.insert(array02,2,array04,axis=1) array05 array02
c.删除数组元素
numpy.delete()
# numpy.delete numpy.delete(arr, obj, axis) # 函数返回从输入数组中删除指定子数组的新数组。 与insert()函数的情况一样,如果未提供轴参数,则输入数组将展开。 ''' 参数说明: arr:输入数组 obj:要沿指定轴删除的子数组的索引,接收切片,整数或整数数组 axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开 ''' a = np.arange(12).reshape(3,4) a # 未传递 Axis 参数。 在删除之前输入数组会被展开 np.delete(a,5) # 删除每一行中的第二列 np.delete(a,1,axis = 1)
numpy.unique()
# numpy.unique 函数用于去除数组中的重复元素。 numpy.unique(arr, return_index, return_inverse, return_counts) ''' 参数说明: arr:输入数组,如果不是一维数组则会展开 return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储 return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储 return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数 ''' a = np.array([5,2,6,2,7,5,6,8,2,9]) a # 第一个数组的去重值 u = np.unique(a) u # 去重数组的索引数组 u,indices = np.unique(a, return_index = True) indices # 去重数组的下标 u,indices = np.unique(a,return_inverse = True) u indices # 返回去重元素的重复数量 u,indices = np.unique(a,return_counts = True) u indices
numpy.clip()
t.clip(10,18) # 小于10的替换成10,大于18的替换成18
#这是jupyter notebook的笔记 import numpy as np t=np.arange(24).reshape(4,6) t #元素删除:numpy.delete() array02 np.delete(array02,2) np.delete(array02,[2,4,6,8]) np.delete(array02,2,axis=0) #数组元素去重numpy.unique() array03=np.array([[0,11,22,3,4,5], [11,12,13,14,15,11], [11,12,13,14,15,11], [18,16,20,21,15,23]]) array03 #np.unique(array03,axis=0)#意思是两行元素完全相同的时候才算做重复 np.unique(array03,return_inverse=True,axis=0)#意思是两行元素完全相同的时候才算做重复 array03#说明什么视图与本质还是有区别的 np.unique(array03,return_index=True,axis=0)#意思是两行元素完全相同的时候才算做重 np.unique(array03,return_counts=True,axis=0)#意思是两行元素完全相同的时候才算做重复 #数组的裁减numpy.clip() array03 np.clip(array03,12,20)#小于12的都变成了12 ,大于20的都变成了20 array03 np.clip(array03,12,20,out=array03)#小于12的都变成了12 ,大于20的都变成了20 array03#说明啥子,使用out以后原数组也变了,就地裁剪。
d.数组的行列转换、迭代,转置
t[[1, 2], :] = t[[2, 1], :] # 行列交换 t[: ,[0, 2]] = t[: ,[2, 0]] # 列交换
import numpy as np array01=np.arange(24).reshape(4,6) array01 array01[[0,1],:]=array01[[1,0],:]#行交换 array01 array01[:,[2,3]]=array01[:,[3,2]]#列的交换 array01#原理:x,y=y,x
#迭代数组 array01.shape array01.ndim #;利用flat扁平化一位数组,然后遍历、迭代 for item in array01.flat:#二维数组的迭代 print(item) for i in range(array01.size): print(array01.flat[i]) for item in np.nditer(array01):#相当于array01.flat print(item) #for...for 循环 for item in array01: print(item) for items in array01:#嵌套循环 for item in items: print(item)
转置:np.transpose()、array.T、rollaxis()、swapaxes()
# 数组的转置 array01 array01.T#行列的变换 np.transpose(array01,axes=(1,0)) np.transpose(array01,axes=(0,1))
e.连接和分割数组
连接:numpy.concatenate()、numpy.column_stack()、numpy.row_stack()
连接:numpy.stack()、numpy.hstack()、numpy.vstack、numpy.dstack()、numpy.pad()
垂直方向操作:vstack()
import numpy as np a = np.arange(1, 7).reshape(2, 3) b = np.arange(7, 13).reshape(2, 3) a,b # 垂直方向完成组合操作,生成新数组 c = np.vstack((a, b)) # 垂直方向完成拆分操作,生成两个数组 d, e = np.vsplit(c, 2)
水平方向操作:hstack()
import numpy as np a = np.arange(1, 7).reshape(2, 3) b = np.arange(7, 13).reshape(2, 3) a,b # 水平方向完成组合操作,生成新数组 c = np.hstack((a, b)) # 水平方向完成拆分操作,生成两个数组 d, e = np.hsplit(c, 2)
深度方向操作:dstack()(3维)
import numpy as np a = np.arange(1, 7).reshape(2, 3) b = np.arange(7, 13).reshape(2, 3) a,b # 深度方向(3维)完成组合操作,生成新数组 i = np.dstack((a, b)) # 深度方向(3维)完成拆分操作,生成两个数组 k, l = np.dsplit(i, 2)
长度不等的数组组合:
import numpy as np a = np.array([1,2,3,4,5]) b = np.array([1,2,3,4]) a,b # 填充b数组使其长度与a相同 b = np.pad(b, pad_width=(0, 1), mode='constant', constant_values=-1) b # 垂直方向完成组合操作,生成新数组 c = np.vstack((a, b)) c
多维数组组合与拆分的相关函数:
# 通过axis作为关键字参数指定组合的方向,取值如下:
# 若待组合的数组都是二维数组:
# 0: 垂直方向组合
# 1: 水平方向组合
# 若待组合的数组都是三维数组:
# 0: 垂直方向组合
# 1: 水平方向组合
# 2: 深度方向组合
np.concatenate((a, b), axis=0) # 通过给出的数组与要拆分的份数,按照某个方向进行拆分,axis的取值同上 np.split(c, 2, axis=0)
简单的一维数组组合方案
a = np.arange(1,9) b = np.arange(9,17) #把两个数组摞在一起成两行 c = np.row_stack((a, b)) c #把两个数组组合在一起成两列 d = np.column_stack((a, b)) d
分割:numpy.split()、numpy.hsplit()、numpy.vsplit()、numpy.dsplit()
将一个数组拆分为几个较小的数组
hsplit # 沿数组的水平轴拆分数组 vsplit # 沿数组的垂直轴拆分数组 array_split # 指定沿哪个轴分割
上述jupyter的代码笔记如下
#连接数组num import numpy as np array01=np.arange(24).reshape(4,6) array01 array02 = np.arange(24).reshape(4,6) array02 np.concatenate((array01,array02),axis=0) #按照列的个数匹配链接 np.concatenate((array01,array02),axis=1) #按照列的个数匹配链接 #numpy.column_stack(*args,**kwargs) np.column_stack((array01,array02)) np.row_stack((array01,array02)) #np.dstack(a1,a2) np.dstack((array01,array02)) #分割数组: #水平切 np.hsplit(array01,2) array01 array04,array05,array06=np.hsplit(array01,3) array04 array05 array06 #垂直切(与上面同理) np.vsplit(array02,2) #沿深度切 #np.dstack(a1,a2) array03=np.dstack((array01,array02)) array03 array04,array05=np.vsplit(array03,2) array04 array05