【Python】Python中的数组、列表、元组、Numpy数组、Numpy矩阵

前言

面试中特别重视对于数据结构的考查(某次面试被问及Python中列表和数组的区别,回答的不好,痛定思痛,扎实的基础决定面试的成败!)
本节简要总结Python中数组、列表、元组、Numpy数组、Numpy矩阵的概念与联系。

1. 数组

  • Python没有数组!!!

2. 列表

  • python内置类型,即动态数组,C++标准库的vector,但可含不同类型的元素于一个list中。
  • 下标:按下标读写,就当作数组处理,以0开始,有负下标的使用
  • list的常用方法
    • L.append(var) #追加元素
    • L.insert(index,var)
    • L.pop(var) #返回最后一个元素,并从list中删除之
    • L.remove(var) #删除第一次出现的该元素
    • L.count(var) #该元素在列表中出现的个数
    • L.index(var) #该元素的位置,无则抛异常
    • L.extend(list) #追加list,即合并list到L上
    • L.sort() #排序
    • L.reverse() #倒序
  • 更多操作:Python 列表(list)操作

3. 元组

  • tuple也是一个class,是不可变的list类型,不可以增删改。
  • 任意无符号的对象,以逗号隔开,默认为元组。
  • 详细用法:python中元组(tuple)用法总结

与list的异同

异:

  • 元组一旦创建不可改变,例如:aa=tuple(1,2,3);
  • 元组不能追加(append)元素,弹出(pop)元素等;
  • 只能对元组中的元素进行索引aa[0],不能对其中的元组进行赋值aa[0]=8;
  • 使用元组的好处在于对元组进行操作更为高效,适合存放一组常量;

同:

  • 定义 tuple 与定义 list 的方式相同, 除了整个元素集是用小括号包围的而不是方括号。
  • Tuple 的元素与 list 一样按定义的次序进行排序。 Tuples 的索引与 list 一样从 0 开始, 所以一个非空 tuple 的第一个元素总是 t[0]。
  • 负数索引与 list 一样从 tuple 的尾部开始计数。
  • 与 list 一样分片 (slice) 也可以使用。注意当分割一个 list 时, 会得到一个新的 list ;当分割一个 tuple 时, 会得到一个新的 tuple。

用 Tuple 的好处

Tuple 比 list 操作速度快。如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list。
如果对不需要修改的数据进行 “写保护”,可以使代码更安全。使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句,说明这一数据是常量。如果必须要改变这些值,则需要执行 tuple 到 list 的转换。

Tuple 与 list 的转换

Tuple 可以转换成 list,反之亦然。从效果上看,tuple 冻结一个 list,而 list 解冻一个 tuple。
内置的 tuple 函数接收一个 list,并返回一个有着相同元素的 tuple。

a = [1, 2, 3]
tuple(a)

而 list 函数接收一个 tuple 返回一个 list。

a = (1, 2, 3)
list(a)

4. Numpy数组

  • Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
  • 使用Python列表可以存储一维数组,通过列表的嵌套可以实现多维数组。
# 使用列表创建二维数组
arr1 = [[1, 2], [3, 4]]  
# 使用Numpy创建二维数组
import numpy as np
arr2 = np.array([[1, 2], [3, 4]])

为什么需要使用Numpy

  • Numpy是专门针对数组的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。
  • 通常Numpy数组中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以在通用性能方面Numpy数组不及Python列表,但在科学计算中,可以省掉很多循环语句,代码使用方面比Python列表简单的多。

另外,具体使用过程中:
(1)list不具有array的全部属性(如维度、转置等)

#eg1_1
import numpy as np
a = np.array([[1,2,0,1],[1,6,9,55],[7,8,9,5]])#a为数组
print(a.T)
 
#Result:
[[ 1  1  7]
 [ 2  6  8]
 [ 0  9  9]
 [ 1 55  5]]
 
#eg1_2
a = [[1,2,0,1],[1,6,9,55],[7,8,9,5]] #a为列表
print(a.T)
 
#Result:
'list' object has no attribute 'T'
#eg1_3
import numpy as np
a=np.array([[1,2,3],[1,1,4],[1,5,1]])
print(a.shape)
 
#Result:
(3, 3)
 
#eg1_4
a=[[1,2,3],[1,1,4],[1,5,1]]
print(a.shape)
 
#Result
'list' object has no attribute 'shape'

(2)a[:m]的含义,a可以是列表或者数组,但是无论是哪种情况,a[:0]为空

#eg2_1
import numpy as np
a=np.array([[4,1,2],
            [7,4,10],
            [12,17,88]])
#a=np.array([(4,1,2),
#            (7,4,10),
#            (12,17,88)]) 这两个a中[和(不一样,其实它们完全一样
print(a[:0])
print(a[:1])
print(a[:2])
 
#Result:
[]
[[4 1 2]]
[[ 4  1  2]
 [ 7  4 10]]
 
#eg2_1
a=[(4,1,2),(7,4,10),(12,17,88)]
print(a[:0])
print(a[:1])
print(a[:2])
 
 
#Result:
[]
[(4, 1, 2)]
[(4, 1, 2), (7, 4, 10)]

(3)array和list关于“==”的计算

#eg3_1
import numpy as np
a=np.array(['dog','cat','car'])
b=np.array(['dog','cat','trunk'])
acc = (np.mean(a == b))
print(acc)
 
#Result
0.6666666666666666
 
#eg3_2
import numpy as np
a=['dog','cat','car']
b=['dog','cat','trunk']
acc = (np.mean(a == b))
print(acc)
 
#Result
0.0

(4)array和list关于“*”的计算

from numpy import *
#a为数组
a=array([[1,2,3],
   [4,5,6]])
b=4*a
print(b)    
 
[[ 4  8 12]
 [16 20 24]]
 
 
from numpy import *
#a为列表
a=([[1,2,3],
   [4,5,6]])
b=4*a
print(b)
 
[[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]

5. Numpy矩阵

Numpy数组和矩阵的区别:

  1. Numpy matrices必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND). Matrix是Array的一个小的分支,包含于Array。所以matrix 拥有array的所有特性。
  2. 在numpy中matrix的主要优势是:相对简单的乘法运算符号。例如,a和b是两个matrices,那么a*b,就是矩阵积。
  3. matrix 和 array 都可以通过objects后面加.T 得到其转置。但是 matrix objects 还可以在后面加 .H f得到共轭矩阵, 加 .I 得到逆矩阵。
  4. 相反的是在numpy里面arrays遵从逐个元素的运算,所以array:c 和d的c*d运算相当于matlab里面的c.*d运算。而矩阵相乘,则需要numpy里面的dot命令 。

例如:
在这里插入图片描述
在这里插入图片描述

  1. ** 运算符的作用也不一样 :因为a是个matrix,所以a2返回的是a*a,相当于矩阵相乘。而c是array,c2相当于,c中的元素逐个求平方。
    在这里插入图片描述

  2. 问题就出来了,如果一个程序里面既有matrix 又有array,会让人脑袋大。但是如果只用array,你不仅可以实现matrix所有的功能,还减少了编程和阅读的麻烦。

  3. 当然你可以通过下面的两条命令轻松的实现两者之间的转换:np.asmatrix和np.asarray

  4. numpy 中的array与numpy中的matrix的最大的不同是,在做归约运算时,array的维数会发生变化,但matrix总是保持为2维。例如下面求平均值的运算.
    在这里插入图片描述
    在这里插入图片描述

参考
Python 列表(list)操作
python中元组(tuple)用法总结
python中的数组和列表
Python列表、Numpy数组与矩阵的区别

原创文章 36 获赞 32 访问量 2752

猜你喜欢

转载自blog.csdn.net/weixin_43868754/article/details/105069141