python 中各类型介绍及相互转换 - list, array, tensor, dict, tuple, DataFrame
Posted 无脑敲代码,bug漫天飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 中各类型介绍及相互转换 - list, array, tensor, dict, tuple, DataFrame相关的知识,希望对你有一定的参考价值。
目录
1 python 各类封装包数据类型
1.1 list类型
列表,是python中最基本的数据结构;
1. 每个元素都可以通过索引获取,索引就是index = 0, 1, ...;
2. 列表的数据项不需要有相同的数据类型,其写法就是: 使用逗号将不同的数据项分割,使用方括号扩起来就可以;
例子:
list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
3. 使用索引获取列表数据:
例子:
>>> list1 = ['physics', 'chemistry', 1997, 2000]
>>> list1[0]
'physics'
>>> list1[2:4]
[1997, 2000]
4. 使用索引修改列表值:
例子:
>>> list1 = ['physics', 'chemistry', 1997, 2000]
>>> list1[3] = 2345
>>> list1
['physics', 'chemistry', 1997, 2345]
5. 向列表添加元素:
例子:
>>> list1.append('qiqiqi')
>>> list1
['physics', 'chemistry', 1997, 2345, 'qiqiqi']
6. 删除列表元素
例子:
>>> list1
['physics', 'chemistry', 1997, 2345, 'qiqiqi']
>>> del list1[1]
>>> list1
['physics', 1997, 2345, 'qiqiqi']
>>> list1.remove(1997)
>>> list1
['physics', 2345, 'qiqiqi']
7. 合并两个列表
例子:
>>> list1
['physics', 1997, 2345, 'qiqiqi']
>>> list2 = [1,1,3]
>>> list1+list2
['physics', 1997, 2345, 'qiqiqi', 1, 1, 3]
8. 获取某元素在列表中出现的次数
例子:
>>> list1+list2
['physics', 1997, 2345, 'qiqiqi', 1, 1, 3]
>>> (list1+list2).count(1)
2
9. 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
例子:
>>> list1
['physics', 2345, 'qiqiqi']
>>> list1.extend(list2)
>>> list1
['physics', 2345, 'qiqiqi', 1, 1, 3]
1.2 dict类型
字典是python另一种可变容器模型,可以存储任意类型对象;
字典的每个键值对( key:value )用冒号 : 分割,每个键值对之间用逗号 (, )分割,整个字典包括在花括号 中;
字典的键是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一;
值可以取任意的数据类型;
1. 通过键来访问值:
例子:
>>> tinydict = 'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'
>>> tinydict['Beth']
'9102'
2. 使用键修改字典对应的值:
例子:
>>> tinydict['Beth'] = 6666
>>> tinydict
'Alice': '2341', 'Beth': 6666, 'Cecil': '3258'
3. 删除某一元素, 清空字典,删除字典:
例子:
>>> del tinydict['Beth']
>>> tinydict
'Alice': '2341', 'Cecil': '3258'
>>> tinydict
'Alice': '2341', 'Cecil': '3258'
>>> tinydict.clear() # 清空字典
>>> tinydict
>>> del tinydict # 删除字典
>>> tinydict
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'tinydict' is not defined
4. 以列表返回一个字典所有的键
例子:
>>> tinydict.keys()
dict_keys(['Alice', 'Beth', 'Cecil'])
1.3 tuple类型
与列表类型不同之处在于,其使用小括号,且值不能被修改;
1. 使用索引访问元素(与list相同)
例子:
>>> tup1 = ('physics', 'chemistry', 1997, 2000)
>>> tup1[0]
'physics'
2. 对元组进行连接:
例子:
>>> tup1 = ('physics', 'chemistry', 1997, 2000)
>>> tup1[0]
'physics'
>>> tup2 = ('1','cs')
>>> tup3 = tup1 + tup2
>>> tup3
('physics', 'chemistry', 1997, 2000, '1', 'cs')
1.4 array 数组对象
Numpy 支持大量的维度数组与矩阵运算,且针对数组运算提供了大量的数学函数库;
NumPy 通常与 SciPy(Scientific Python, SciPy 是一个开源的 Python 算法库和数学工具包)和 Matplotlib(绘图库,是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习;
1. NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合;
2. ndarray 是用于存放同类型元素的多维数组,每个元素占有相同大小的内存区域;
3. 创建n维数组;
例子:
>>> import numpy as np
>>> a = np.array([1,2,3]) # 一维数组
>>> a
array([1, 2, 3])
>>> a = np.array([[1, 2], [3, 4]])
>>> a
array([[1, 2],
[3, 4]]) # 多维数组
4. numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未赋值的数组
例子:
>>> x = np.empty([3,2], dtype = int)
>>> x
array([[ 7290888465049002104, 3184989590875566189],
[ 8104636977815248178, 2987133850644979813],
[-5764607523034234870, -5764607523034234880]])
>>> x.shape
(3, 2)
>>> x.dtype
dtype('int64')
5. 创建值全为0的数组:
例子:
>>> x = np.zeros(5) # 默认是浮点数类型
>>> x
array([0., 0., 0., 0., 0.])
>>> y = np.zeros((5,), dtype = int)
>>> y
array([0, 0, 0, 0, 0])
>>> y.shape
(5,)
>>> y.dtype
dtype('int64')
>>> n = np.zeros((3,2))
>>> n
array([[0., 0.],
[0., 0.],
[0., 0.]])
6. 从数值范围创建数组(np.arange):
例子:
numpy.arange(start, stop, step, dtype)
# start 起始值,默认为0
# stop 终止值(不包含)
# step 步长,默认为1
# dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型
>>> x = np.arange(1,5,2)
>>> x
array([1, 3])
7. 修改数组形状:
例子:
numpy.reshape(arr, newshape, order='C') # 不改变数据的条件下修改形状
# arr:要修改形状的数组
# newshape:整数或者整数数组,新的形状应当兼容原有形状
>>> a = np.arange(8)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> b = a.reshape(4,2)
>>> b
array([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
ndarray.flatten(order='C') # 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
# order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'K' -- 元素在内存中的出现顺序。
>>> b.flatten(order = 'F')
array([0, 2, 4, 6, 1, 3, 5, 7])
1.5 tensor 对象
torch.Tensor是一种包含单一数据类型元素的多维矩阵;torch.Tensor是默认的tensor类型(torch.FlaotTensor)的简称;
1. 张量可以从python的list构成;
例子:
>>> import torch
>>> a = torch.FloatTensor([[1, 2, 3], [4, 5, 6]])
>>> a
tensor([[1., 2., 3.],
[4., 5., 6.]])
2. 创建未初始化的张量
例子:
>>> x = torch.empty(5,3)
>>> x
tensor([[0.0000e+00, 1.4013e-45, 0.0000e+00],
[0.0000e+00, 0.0000e+00, 0.0000e+00],
[0.0000e+00, 0.0000e+00, 0.0000e+00],
[1.1704e-41, 0.0000e+00, 2.2369e+08],
[0.0000e+00, 0.0000e+00, 0.0000e+00]])
3. 创建随机初始化的张量:
例子:
>>> y = torch.rand(2,2) # 包含了从区间[0,1)的均匀分布中抽取一组随机数,形状由可变参数size定义
>>> y
tensor([[0.7967, 0.0257],
[0.0560, 0.9289]])
>>> y.size
<built-in method size of Tensor object at 0x7fa945882e50>
>>> y.size()
torch.Size([2, 2])
>>> y.shape
torch.Size([2, 2])
4. 创建全为0的张量
例子:
>>> z = torch.zeros(2,2)
>>> z
tensor([[0., 0.],
[0., 0.]])
5. 随机生成张量
例子:
>>> q = torch.arange(8)
>>> q
tensor([0, 1, 2, 3, 4, 5, 6, 7])
6. 张量数据类型转换:
例子:
# 使用独立的函数如 int(),float()等进行转换
>>> q = q.float()
>>> q
tensor([0., 1., 2., 3., 4., 5., 6., 7.])
# 使用torch.type()函数
>>> q = q.type(torch.FloatTensor)
>>> q
tensor([0., 1., 2., 3., 4., 5., 6., 7.])
# 使用type_as()函数
>>> y = torch.arange(2)
>>> y = y.type_as(q)
>>> y
tensor([0., 1.])
7. 张量形状改变
例子:
>>> q.view(4,-1)
tensor([[0., 1.],
[2., 3.],
[4., 5.],
[6., 7.]])
8. 张量压缩维度:
例子:
>>> q = q.view(4,1,-1)
>>> q.shape
torch.Size([4, 1, 2])
>>> q = q.squeeze(1)
>>> q
tensor([[0., 1.],
[2., 3.],
[4., 5.],
[6., 7.]])
>>> q.shape
torch.Size([4, 2])
9. 张量扩张维度
例子:
>>> q = q.unsqueeze(1)
>>> q.shape
torch.Size([4, 1, 2])
1.6 DataFrame对象
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。
DataFrame既有行索引,也有列索引,可以看作由 Series 组成的字典(共同用一个索引);
1. DataFrame构造方法
例子:
pandas.DataFrame( data, index, columns, dtype, copy)
# data:一组数据(ndarray、series, map, lists, dict 等类型)
# index:索引值,或者可以称为行标签
# columns:列标签,默认为 RangeIndex (0, 1, 2, …, n)
# dtype:数据类型
>>> import pandas as pd
>>> data = [['Google',10],['Runoob',12],['Wiki',13]]
>>> df = pd.DataFrame(data,columns=['Site','Age'],dtype=float)
>>> df
Site Age
0 Google 10.0
1 Runoob 12.0
2 Wiki 13.0
2. 使用 nparray (ndarray 的长度必须相同)创建DataFrame
例子:
>>> data = 'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]
>>> data
'Site': ['Google', 'Runoob', 'Wiki'], 'Age': [10, 12, 13]
>>> type(data)
<class 'dict'>
>>> data = pd.DataFrame(data)
>>> data
Site Age
0 Google 10
1 Runoob 12
2 Wiki 13
3. 使用dict创建DataFrame,没有对应的部分数据为 NaN
例子:
>>> data = ['a': 1, 'b': 2,'a': 5, 'b': 10, 'c': 20]
>>> df = pd.DataFrame(data)
>>> df
a b c
0 1 2 NaN
1 5 10 20.0
4. 使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1
例子:
>>> df
a b c
0 1 2 NaN
1 5 10 20.0
>>> df.loc[0]
a 1.0
b 2.0
c NaN
Name: 0, dtype: float64
5. 返回指定列的数据
例子:
>>> df['a']
0 1
1 5
Name: a, dtype: int64
2 python内数据类型之间转换
2.1 list, tuple转numpy
使用: numpy = np.array(list)
例子:
>>> list1
['physics', 2345, 'qiqiqi', 1, 1, 3]
>>> numpy1 = np.array(list1)
>>> numpy1
array(['physics', '2345', 'qiqiqi', '1', '1', '3'], dtype='<U21')
>>> tup1 = (1,3,'ds')
>>> numpy3 = np.array(tup1)
>>> numpy3
array(['1', '3', 'ds'], dtype='<U21') # 可以看到元素是同一数据类型
# 这个array不能转化为tensor类型,因为 tensor内元素不支持string类型
2.2 numpy 转 list
使用: list = numpy.tolist()
例子:
>>> numpy2 = np.arange(4)
>>> numpy2
array([0, 1, 2, 3])
>>> list2 = numpy2.tolist()
>>> list2
[0, 1, 2, 3]
2.3 numpy 转 tensor
使用: tensor = torch.tensor(numpy ) 或者 tensor = torch.from_numpy(numpy)
例子:
>>> numpy4 = np.empty((3,2))
>>> numpy4
array([[0., 0.],
[0., 0.],
[0., 0.]])
>>> tensor1 = torch.tensor(numpy4)
>>> tensor1
tensor([[0., 0.],
[0., 0.],
[0., 0.]], dtype=torch.float64)
# from_numpy形式
>>> numpy5 = np.arange(4)
>>> numpy5
array([0, 1, 2, 3])
>>> tensor2 = torch.from_numpy(numpy5)
>>> tensor2
tensor([0, 1, 2, 3])
2.4 numpy 转 tensor
使用: numpy = tensor.numpy() 或者 numpy = tensor.detach().numpy()
主要区别在于是否使用detach(),也就是返回的新变量是否需要计算梯度。【用了detach(),不需要计算梯度了】
例子:
>>> numpy6 = tensor2.numpy()
>>> numpy6
array([0, 1, 2, 3])
>>> numpy7 = tensor2.detach().numpy()
>>> numpy7
array([0, 1, 2, 3])
2.5 list 转 tensor
先转为numpy, 再转为tensor,包装list内的元素是tensor内元素要求的类型(float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint8, and bool.) 且list内元素维度一致;
例子:
当list内元素包含list,和其他类型时,不能转化:
>>> list3 = [1,2,[2,3]]
>>> numpy8 = np.array(list3)
array([1, 2, list([2, 3])], dtype=object)
>>> tensor4 = torch.tensor(numpy8)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint8, and bool.
# 因为numpy中元素是list类型的
正常情况:
>>> list4 = [[1,2],[2,3]]
>>> numpy9 = np.array(list4)
>>> numpy9
array([[1, 2],
[2, 3]])
>>> tensor5 = torch.tensor(numpy9)
>>> tensor5
tensor([[1, 2],
[2, 3]])
list转tensor 也可以直接转化
例子:
>>> tensor6 = torch.tensor(list4)
>>> tensor6
tensor([[1, 2],
[2, 3]])
当list中的每个元素都是tensor类型时:
转化方法:
val = torch.tensor([item.cpu().detach().numpy() for item in val]).cuda()
2.6 tensor转list
Tensor不可直接转换为list , 需要先转换为numpy,然后在转换为list
使用: list = tensor.numpy().tolist()
例子:
>>> list5 = tensor6.numpy().tolist()
>>> list5
[[1, 2], [2, 3]]
2.7 list 转 DataFrame
两个不同列表转换成为DataFrame:
使用: DataFrame = pd.DataFrame(list)
例子:
>>> a=[1,2,3,4]#列表a
>>> b=[5,6,7,8]#列表b
>>> c="a" : a,"b":b
>>> data = pd.DataFrame(c)
>>> data
a b
0 1 5
1 2 6
2 3 7
3 4 8
python 列表与字典相互转换
1. 2个列表转换为字典
#encoding=utf-8
list1=["a","b","c"]
list2=[1,2,3]
d={}
for i in range(len(list1)):
d[list1[i]]=list2[i]
print (d)
2. 使用内置函数 zip
3.求一个列表中所有数据类型的次数
#encoding=utf-8
l = [1,2,"s",[1,23],{1:2},(1,2),set([1,2]),"b",-2]
d = {"int":0,"str":0,"list":0,"tuple":0,"set":0,"dict":0,"complex":0} #先用字典定义列表中的数据类型
for i in l:
if isinstance(i,str): 判断字符串类型
d["str"]+=1
if isinstance(i,int): 判断整型类型
d["int"]+=1
if isinstance(i,list):
d["list"]+=1
if isinstance(i,set):
d["set"]+=1
if isinstance(i,tuple):
d["tuple"]+=1
if isinstance(i,dict):
d["dict"]+=1
if isinstance(i,complex): 判断复数类型
d["complex"]+=1
print(d)
{\'int\': 3, \'str\': 2, \'list\': 1, \'tuple\': 1, \'set\': 1, \'dict\': 1, \'complex\': 0}
4. 字典转化成列表
以上是关于python 中各类型介绍及相互转换 - list, array, tensor, dict, tuple, DataFrame的主要内容,如果未能解决你的问题,请参考以下文章