python 中的list和array的不同之处及转换问题

python中的list是python的内置数据类型,list中的数据类不必相同的,而array的中的类型必须全部相同。在list中的数据类型保存的是数据的存放的地址,简单的说就是指针,并非数据,这样保存一个list就太麻烦了,例如list1=[1,2,3,'a']需要4个指针和四个数据,增加了存储和消耗cpu。

numpy中封装的array有很强大的功能,里面存放的都是相同的数据类型

list1=[1,2,3,'a']
print list1
a=np.array([1,2,3,4,5])
b=np.array([[1,2,3],[4,5,6]])
c=list(a)  # array到list的转换
print a,np.shape(a)
print b,np.shape(b)
print c,np.shape(c) 

运行结果:

[1, 2, 3, 'a'] # 元素数据类型不同,并且用逗号隔开
[1 2 3 4 5] (5L,) # 一维数组,类型用tuple表示
[[1 2 3]
 [4 5 6]] (2L, 3L)
[1, 2, 3, 4, 5] (5L,) 

创建:

array的创建:参数既可以是list,也可以是元组.使用对应的属性shape直接得到形状

a=np.array((1,2,3,4,5))# 参数是元组
b=np.array([6,7,8,9,0])# 参数是list
c=np.array([[1,2,3],[4,5,6]])# 参数二维数组
print a,b,
c.shape() 

也可以直接改变属性array的形状,-1代表的是自己推算。这里并不是T, reshape(())也可以

c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])
c.shape # (3L, 4L)
c.shape=4,-1  //c.reshape((2,-1))
c
<pre style="box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 17.0001px; word-break: break-all; word-wrap: break-word; border: 0px; border-radius: 0px; white-space: pre-wrap; vertical-align: baseline; background-color: rgb(255, 255, 255);">array([[ 1, 2, 3],
    [ 4, 4, 5],
    [ 6, 7, 7],
    [ 8, 9, 10]])  

这里的reshape最终相当于是一个浅拷贝,也就是说还是和原来的书c使用相同的内存空间

d=c.reshape((2,-1))
d[1:2]=100
c
array([[ 1,  2,  3],
    [ 4,  4,  5],
    [100, 100, 100],
    [100, 100, 100]])

前面在创建数组的时候并没有使用数据类型,这里我们也可以使用数据类型。默认的是int32.

a1=np.array([[1,2,3],[4,5,6]],dtype=np.float64)
print a1.dtype,a.dtype #float64 int32<pre style="margin-top: 0px; margin-bottom: 0px; line-height: 17.0001px; box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; word-break: break-all; word-wrap: break-word; border: 0px; border-radius: 0px; white-space: pre-wrap; vertical-align: baseline; background-color: rgb(255, 255, 255);"> 

前面在创建的时候我们都是使用的np.array()方法从tuple或者list转换成为array,感觉很是费劲,numpy自己提供了很多的方法让我们自己直接创建一个array.

arr1=np.arange(1,10,1) #
arr2=np.linspace(1,10,10)
print arr1,arr1.dtype
print arr2,arr2.dtype
[1 2 3 4 5 6 7 8 9] int32
[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.] float64

np.arange(a,b,c)表示产生从a-b不包括b,间隔为c的一个array,数据类型默认是int32。但是linspace(a,b,c)表示的是把a-b平均分成c分,它包括b。

有时候我们需要对于每一个元素的坐标进行赋予不同的数值,可以使用fromfunction函数

def fun(i):
  return i%4+2
np.fromfunction(fun,(10,))
array([ 2., 3., 4., 5., 2., 3., 4., 5., 2., 3.])  

fromfunction必须支持多维数组,所以他的第二个参数必须是一个tuple,只能是(10,),(10)是错误的。

def fun2(i,j):
  return (i+1)*(j+1)
np.fromfunction(fun2,(9,9)) 

array([[ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.],
    [ 2.,  4.,  6.,  8., 10., 12., 14., 16., 18.],
    [ 3.,  6.,  9., 12., 15., 18., 21., 24., 27.],
    [ 4.,  8., 12., 16., 20., 24., 28., 32., 36.],
    [ 5., 10., 15., 20., 25., 30., 35., 40., 45.],
    [ 6., 12., 18., 24., 30., 36., 42., 48., 54.],
    [ 7., 14., 21., 28., 35., 42., 49., 56., 63.],
    [ 8., 16., 24., 32., 40., 48., 56., 64., 72.],
    [ 9., 18., 27., 36., 45., 54., 63., 72., 81.]])

虽然说,这里提供了很多的直接产生array的方式,但是大部分情况我们都是会从list进行转换,因为在实际的处理中,我们需要从txt加载文件,那样直接读入的数据显示存放到list中,需要处理的时候我们转换到array,因为
array的设计更加符合我们的使用,涉及到矩阵的运算在使用mat,那么list主要就是用进行元素的索取。

def loaddataSet(fileName):
  file=open(fileName)
  dataMat=[] //
  for line in file.readlines():
    curLine=line.strip().split('\t')
    floatLine=map(float,curLine)//这里使用的是map函数直接把数据转化成为float类型
    dataMat.append(floatLine)
  return dataMat  

上面的韩顺返回最终的数据就是最初的list数据集,再根据不同的处理需求是转化到array还是mat。其实array是mat的父类,能用mat的地方,array理论上都能传入。

元素访问:

arr[5] #5
arr[3:5] #array([3, 4])
arr[:5] #array([0, 1, 2, 3, 4])
arr[:-1]# array([0, 1, 2, 3, 4, 5, 6, 7, 8])
arr[:] #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[2:4]=100 # array([ 0,  1, 100, 100,  4,  5,  6,  7,  8,  9])
arr[1:-1:2] #array([ 1, 100,  5,  7]) 2 是间隔
arr[::-1] #array([ 9,  8,  7,  6,  5,  4, 100, 100,  1,  0])
arr[5:2:-1]# -1的间隔表示从右向左所以5>2 #array([ 5,  4, 100]) 

上面是array的一维数组的访问方式,我们再来看看二维的处理方式

print c[1:2]# c[1:2].shape-->(1L, 3L)
print c[1:2][0] # shape-->(3L,)
[[4 4 5]]
[4 4 5]
[python] view plain copy
print c[1]
print c[1:2]
[4 4 5]
[[4 4 5]]
[python] view plain copy
print c[1][2]
print c[1:4]
print c[1:4][0][2]
5
[[ 4  4  5]
 [100 100 100]
 [100 100 100]]
5

可以看出对于有:的表达最终的结果外面还嵌套一层list的[],。访问的一定要注意,python最bug的就是,语法
灵活,不管怎样写索引语法都是正确的,但是最终的书结果却让你大跌眼镜。

还有array的索引最终产生的是一个一个原始数据的浅拷贝,还和原来的数据共用一块儿内存

b=arr[1:6]
b[:3]=0
arr #<pre style="box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 17.0001px; word-break: break-all; word-wrap: break-word; border: 0px; border-radius: 0px; white-space: pre-wrap; vertical-align: baseline; background-color: rgb(255, 255, 255);">array([0, 0, 0, 0, 4, 5, 6, 7, 8, 9]) 

产生上面的原因是因为array中直接存放的数据,拷贝的话直接拿走的是pointer,没有取走数据,但是list却会直接发生深拷贝,数据指针全部带走

list1=list(c)
list1[1]=0
list1 #上面修改的0并没有被改变
[array([1, 2, 3]), 0, array([100, 100, 100]), array([100, 100, 100])]

除了这些之外还有自己的更加牛掰的方式(只能用array)

1)使用布尔数组.感觉甚是强大,就不要自己写什么判断语句啦,注意这种方式得到结果不和原始数组共享空间。布尔索引仅仅适用于数组array,list没资格用。布尔索引最终得到下标索引为true的数据。索引只能是布尔数组

a=np.array(a*2)
a>5
a[a>5] #
array([16, 32, 48, 64, 80, 16, 32, 48, 64, 80])

2)列表索引

列表索引可以是数组和list。返回的数据不和原来的数据共享内存。索引可以是list和array

x=np.arange(10)
index=[1,2,3,4,5]
arr_index=np.array(index)
print x
print x[index] # list索引
print x[arr_index] # array索引
[0 1 2 3 4 5 6 7 8 9]
[1 2 3 4 5]
[1 2 3 4 5]

array和list区别*2

a=np.arange(10)
lista=list(a)
print a*2
print lista*2
[ 0 2 4 6 8 10 12 14 16 18]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

array的广播

a = np.arange(0, 60, 10).reshape(-1, 1)
b = np.arange(0, 5)
print a
print b
[[ 0]
 [10]
 [20]
 [30]
 [40]
 [50]]
[0 1 2 3 4]
print np.add(a,b,c)
[[ 0 1 2 3 4]
 [10 11 12 13 14]
 [20 21 22 23 24]
 [30 31 32 33 34]
 [40 41 42 43 44]
 [50 51 52 53 54]]

总结

以上所述是小编给大家介绍的python 中的list和array的不同之处及转换问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • Python中列表list以及list与数组array的相互转换实现方法
  • Python列表list数组array用法实例解析
时间: 2018-03-12

Python列表list数组array用法实例解析

本文以实例形式详细讲述了Python列表list数组array用法.分享给大家供大家参考.具体如下: Python中的列表(list)类似于C#中的可变数组(ArrayList),用于顺序存储结构.   创建列表 复制代码 代码如下: sample_list = ['a',1,('a','b')] Python 列表操作 复制代码 代码如下: sample_list = ['a','b',0,1,3] 得到列表中的某一个值 复制代码 代码如下: value_start = sample_list

Python中列表list以及list与数组array的相互转换实现方法

本文实例讲述了Python中list以及list与array的相互转换实现方法.分享给大家供大家参考,具体如下: python中的list是一种有序集合,可以随时增删元素: # -*- coding: utf-8 -*- frameID = 1 frameID_list = [] frameID_list.append(frameID) print (frameID_list) frameID = 2 frameID_list.append(frameID) print (frameID_lis

浅谈python中列表、字符串、字典的常用操作

列表操作如此下: a = ["haha","xixi","baba"] 增:a.append[gg] a.insert[1,gg] 在下标为1的地方,新增 gg 删:a.remove(haha) 删除列表中从左往右,第一个匹配到的 haha del a.[0] 删除下标为0 对应的值 a.pop(0) 括号里不写内容,默认删除最后一个,写了,就删除对应下标的内容 改:a.[0] = "gg" 查:a[0] a.index(&q

python中numpy包使用教程之数组和相关操作详解

前言 大家应该都有所了解,下面就简单介绍下Numpy,NumPy(Numerical Python)是一个用于科学计算第三方的Python包. NumPy提供了许多高级的数值编程工具,如:矩阵数据类型.矢量处理,以及精密的运算库.专为进行严格的数字处理而产生.下面本文将详细介绍关于python中numpy包使用教程之数组和相关操作的相关内容,下面话不多说,来一起看看详细的介绍: 一.数组简介 Numpy中,最重要的数据结构是:多维数组类型(numpy.ndarray) ndarray由两部分组成

Python中列表、字典、元组、集合数据结构整理

本文详细归纳整理了Python中列表.字典.元组.集合数据结构.分享给大家供大家参考.具体分析如下: 列表: 复制代码 代码如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] 字典: 复制代码 代码如下: di = {'a':123,'b':'something'} 集合: 复制代码 代码如下: jihe = {'apple','pear','apple'} 元组: 复制代码 代码如下: t = 123,456,'hello' 1.列表 空

Python中列表元素转为数字的方法分析

本文实例讲述了Python中列表元素转为数字的方法.分享给大家供大家参考,具体如下: 有一个数字字符的列表: numbers = ['1', '5', '10', '8'] 想要把每个元素转换为数字: numbers = [1, 5, 10, 8] 用一个循环来解决: new_numbers = []; for n in numbers: new_numbers.append(int(n)); numbers = new_numbers; 有没有更简单的语句可以做到呢? 1. numbers =

python中列表元素连接方法join用法实例

本文实例讲述了python中列表元素连接方法join用法.分享给大家供大家参考.具体分析如下: 创建列表: >>> music = ["Abba","Rolling Stones","Black Sabbath","Metallica"] >>> print music 输出: ['Abba', 'Rolling Stones', 'Black Sabbath', 'Metallica']

python中print的不换行即时输出的快速解决方法

关于Python2.x和3.x带来的print不换行的问题:昨天有发过推文,利用end = 定义,解决了横向的小问题,但是由于屏幕显示的问题,若字符串长度过大,则会引起不便.两个或多个print做分割的情况下,如何保持依然横向输出,一般的是在print尾部加上逗号(,)但是在3.x下,则不行,需要使用end = "(something)",some signs like , . ; 'also you can put a word or str in"". Exam

Python中实现两个字典(dict)合并的方法

本文实例讲述了Python中实现两个字典(dict)合并的方法,分享给大家供大家参考.具体方法如下: 现有两个字典dict如下: dict1={1:[1,11,111],2:[2,22,222]} dict2={3:[3,33,333],4:[4,44,444]} 合并两个字典得到类似: {1:[1,11,111],2:[2,22,222],3:[3,33,333],4:[4,44,444]} 方法1: dictMerged1=dict(dict1.items()+dict2.items())

判断一个变量是数组Array类型的方法

在很多时候,我们都需要对一个变量进行数组类型的判断.JavaScript中如何判断一个变量是数组Array类型呢?我最近研究了一下,并分享给大家,希望能对大家有所帮助. JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Array的对象就不起作用了. 复制代码 代码如下: alert(typeof null); // "object" alert

数组Array的一些方法(总结)

数组对象属性和方法的概述: 1> arr.push() 将参数添加至数组的末尾,返回的是新数组的长度 2> arr.unshift() 将参数添加到数组的开头,返回新数组的长度 3> arr.shift() 删除数组的第一位,返回被删除的数字 4> arr.pop() 删除数组的最后一位,返回被删除的数字 5> arr.concat()将参数里面的数字合并到原数组后面,不改变原有的数组,返回一个新数组 6> arr.reverse() 翻转数组,改变原有的数组 7>