python数据分析-NumPy学习(中)

简介: python数据分析-NumPy学习

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 序列提供更多的索引方式。除了之前看到的用整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引。

高级索引-菜鸟笔记


1670741973992.jpg

1670741981930.jpg

1670741988802.jpg

1670741999562.jpg

1670742006171.jpg

1670742012924.jpg


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()

1670742074055.jpg

1670742087952.jpg

**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()

1670742143872.jpg


numpy.append()

1670742154253.jpg


#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()

1670742481864.jpg

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()


1670742546860.jpg

# 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()


1670743335258.jpg

# 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()

1670743354834.jpg

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.数组的行列转换、迭代,转置

1670743389093.jpg

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

1670743416605.jpg

#迭代数组
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()

1670743438900.jpg

# 数组的转置
array01
array01.T#行列的变换
np.transpose(array01,axes=(1,0))
np.transpose(array01,axes=(0,1))


e.连接和分割数组


连接:numpy.concatenate()、numpy.column_stack()、numpy.row_stack()

1670743457762.jpg


连接:numpy.stack()、numpy.hstack()、numpy.vstack、numpy.dstack()、numpy.pad()

1670743466649.jpg

垂直方向操作: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()

1670743578049.jpg

将一个数组拆分为几个较小的数组

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
相关文章
|
1天前
|
Python
python pandas学习(一)
该代码段展示了四个主要操作:1) 删除指定列名,如商品id;2) 使用正则表达式模糊匹配并删除列,例如匹配订单商品名称1的列;3) 将毫秒级时间戳转换为带有时区调整的日期时间格式,并增加8小时以适应本地时区;4) 将列表转换为DataFrame后保存为Excel文件,文件路径和名称根据变量拼接而成。
12 3
|
2月前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
2月前
|
Python
Python学习的自我理解和想法(10)
这是我在千锋教育B站课程学习Python的第10天笔记,主要学习了函数的相关知识。内容包括函数的定义、组成、命名、参数分类(必须参数、关键字参数、默认参数、不定长参数)及调用注意事项。由于开学时间有限,记录较为简略,望谅解。通过学习,我理解了函数可以封装常用功能,简化代码并便于维护。若有不当之处,欢迎指正。
|
1月前
|
数据可视化 数据挖掘 大数据
1.1 学习Python操作Excel的必要性
学习Python操作Excel在当今数据驱动的商业环境中至关重要。Python能处理大规模数据集,突破Excel行数限制;提供丰富的库实现复杂数据分析和自动化任务,显著提高效率。掌握这项技能不仅能提升个人能力,还能为企业带来价值,减少人为错误,提高决策效率。推荐从基础语法、Excel操作库开始学习,逐步进阶到数据可视化和自动化报表系统。通过实际项目巩固知识,关注新技术,为职业发展奠定坚实基础。
|
2月前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
2月前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。
|
2月前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
2月前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
2月前
|
存储 索引 Python
Python学习的自我理解和想法(4)
今天是学习Python的第四天,主要学习了列表。列表是一种可变序列类型,可以存储任意类型的元素,支持索引和切片操作,并且有丰富的内置方法。主要内容包括列表的入门、关键要点、遍历、合并、判断元素是否存在、切片、添加和删除元素等。通过这些知识点,可以更好地理解和应用列表这一强大的数据结构。
|
2月前
|
索引 Python
Python学习的自我理解和想法(5)
这是我在B站千锋教育学习Python的第五天笔记,主要内容包括列表的操作,如排序(`sort()`、``sorted()``)、翻转(`reverse()`)、获取长度(`len()`)、最大最小值(`max()`、``min()``)、索引(`index()`)、嵌套列表和列表生成(`range`、列表生成式)。通过这些操作,可以更高效地处理数据。希望对大家有所帮助!

热门文章

最新文章

推荐镜像

更多