python列表、元组、Numpy数组及矩阵的相关总结


参考博客:https://blog.csdn.net/guliang21/article/details/88566158
https://blog.csdn.net/wyl1813240346/article/details/79806207

内容说明

      本文主要是对python列表、元组、Numpy数组的相关用法进行总结归纳,对三种容器的联系与区别进行辨析,帮助读者更清晰的了解python编程中这三类容器的用法。

一、三类容器的基本用法介绍

      该部分内容,主要是介绍三类容器各自的基本及常用操作。对这些基本操作较为了解的读者,可以跳过该部分内容直接进入第二小节。

   1、list列表的基本用法

      列表由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0~9或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。在Python中,用方括号([])来表示列表,并用逗号来分隔其中的元素。列表中的每个元素都有确定的位置,或称索引,第一个元素的索引是0,第二个索引是1,依此类推。
创建列表:

list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5 ];
list3 = ["a", "b", "c", "d"];

访问列表中的元素:

list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5, 6, 7 ];
print(list1[0])
print(list1[-1])
print(list2[1])

运行结果为:

physics
2000
2

注意:在索引中,索引号“-1”指列表中倒数第一个元素。

修改、添加和删除元素:
(1)修改元素
例如,假设有一个摩托车列表,其中的第一个元素为’honda’,如何修改它的值呢?

motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
motorcycles[0] = 'ducati'
print(motorcycles)

运行结果为:

['honda', 'yamaha', 'suzuki']
['ducati', 'yamaha', 'suzuki']

(2)在列表中添加元素
在列表末尾添加元素

motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)

motorcycles.append('ducati')
print(motorcycles)

运行结果为:

['honda', 'yamaha', 'suzuki']
['honda', 'yamaha', 'suzuki', 'ducati']

      通过append函数,即可在列表末尾添加元素。方法append()让动态地创建列表易如反掌,例如,你可以先创建一个空列表,再使用一系列的append()语句添加元素。

在列表中插入元素
      使用方法insert()可在列表的任何位置添加新元素。为此,你需要指定新元素的索引和值。

motorcycles = ['honda', 'yamaha', 'suzuki']
motorcycles.insert(0, 'ducati')
print(motorcycles)

运行结果为:

['ducati', 'honda', 'yamaha', 'suzuki']

      方法insert()在索引0处添加空间,并将值’ducati’存储到这个地方。这种操作将列表中既有的每个元素都右移一个位置。

(3)从列表中删除元素
使用del语句删除元素

motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
del motorcycles[0]
print(motorcycles)

运行结果为:

['honda', 'yamaha', 'suzuki']
['yamaha', 'suzuki']

      del motorcycles[0]则可直接删除列表 motorcycles中的第一个元素。使用del可删除任何位置处的列表元素,条件是知道其索引。

使用方法pop()删除元素
      方法pop()可删除列表末尾的元素,并让你能够接着使用它。术语弹出(pop)源自这样的类比:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素。

motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)

popped_motorcycle = motorcycles.pop()
print(motorcycles)
print(popped_motorcycle)

运行结果为:

['honda', 'yamaha', 'suzuki']
['honda', 'yamaha']
suzuki

      即通过pop用法,将 motorcycles列表中的末尾元素“suzuki”删除了,删除之后,将该元素赋值给了popped_motorcycle。
实际上,pop方法的功能还可以更强大。只要知道列表中某个元素的索引,就可以将其从列表中弹出。

motorcycles = ['honda', 'yamaha', 'suzuki']
first_owned = motorcycles.pop(0)
print('The first motorcycle I owned was a ' + first_owned.title() + '.')

运行结果为:

The first motorcycle I owned was a Honda.

      代码中,.title()的功能是将字符串的首位改为大写。
      如果你不确定该使用del语句还是pop()方法,下面是一个简单的判断标准:如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续使用它,就使用方pop()。

(4)列表切片操作
      要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range()一样,Python在到达你指定的第二个索引前面的元素后停止。要输出列表中的前三个元素,需要指定索引0~3,这将输出分别为0、1和2的元素。

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[1:4])

运行结果为:

['martina', 'michael', 'florence']

      要让切片终止于列表末尾,也可使用类似的语法。例如,如果要提取从第3个元素到列表末尾的所有元素,可将起始索引指定为2,并省略终止索引:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[2:])

运行结果为:

['michael', 'florence', 'eli']

      无论列表多长,这种语法都能够让你输出从特定位置到列表末尾的所有元素。本书前面说过,负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任何切片。例如,如果你要输出名单上的最后三名队员,可使用切片players[-3:]:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[-3:])

运行结果为:

['michael', 'florence', 'eli']

   2、元组(Tuple)的基本用法

      列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的,而不可变的列表被称为元组。
元组看起来犹如列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。

dimensions = (200, 50)
print(dimensions[0])
print(dimensions[1])

运行结果为:

200
50

      虽然不能修改元组的元素,但可以给存储元组的变量赋值。因此,如果要修改前述矩形的尺寸,可重新定义整个元组:

dimensions = (200, 50)
print("Original dimensions:")
for dimension in dimensions:
   print(dimension)
dimensions = (400, 100)
print("\nModified dimensions:")
for dimension in dimensions:
   print(dimension)

运行结果为:

Original dimensions:
200
50
Modified dimensions:
400
100

   3、Nunpy数组的基本用法

      Numpy 是 Python 中科学计算的核心库,NumPy 这个词来源于 Numerical 和 Python 两个单词。它提供了一个高性能的多维数组对象,以及大量的库函数和操作,可以帮助程序员轻松地进行数值计算,广泛应用于机器学习模型、图像处理和计算机图形学、数学任务等领域。
(1)Numpy 数组:ndarray
      NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型,它是描述相同类型的元素集合。ndarray 中的每个元素都是数据类型对象(dtype)的对象。ndarray 中的每个元素在内存中使用相同大小的块。

numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
参数描述
object任何暴露数组接口方法的对象
dtype数据类型
copy如果为 True,则 object 对象被复制,否则,只有当__array__返回副本,object 是嵌套序列,或者需要副本来满足任何其他要求(dtype,order等)时,才会生成副本。
order指定阵列的内存布局。 如果 object 不是数组,则新创建的数组将按行排列(C),如果指定了(F),则按列排列。 如果 object 是一个数组,则以下成立。C(按行)、F(按列)、A(原顺序)、K(元素在内存中的出现顺序)
subok默认情况下,返回的数组被强制为基类数组。 如果为 True,则返回子类。
ndmin返回数组的最小维数

示例代码:

import numpy as np

a = [1, 2, 3]
b = np.array(a)

print(b)
print(type(b))

输出:

[1 2 3]
<class 'numpy.ndarray'>

注意:list 打印显示是 [1, 2, 3],而 ndarray 打印显示是 [1 2 3],当中没有逗号。

dtype 参数用法示例:

import numpy as np

a = [1, 2, 3]
b = np.array(a, dtype=np.float_)
# 或者
b = np.array(a, dtype=float)

print(b)
print(b.dtype)
print(type(b[0]))

输出:

[1. 2. 3.]
float64
<class 'numpy.float64'>

copy 参数的用法:

示例代码:

import numpy as np

a = np.array([1, 2, 3])
b = np.array(a, copy=True)
a[0] = 0

print(a)
print(b)

输出:

[0 2 3]
[1 2 3]

可以看到 a 和 b 的值不同,说明 b 是 a 的副本,两个是不同的对象。

ndmin 参数用法示例:
示例代码:

import numpy as np

a = [1, 2, 3]
b = np.array(a, ndmin=2)

print(b)

输出:

[[1 2 3]]

(2)NumPy 数组属性

      NumPy 数组的维度(又称维数)称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推。NumPy 中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。

ndarray.ndim秩,即轴的数量或维度的数量
ndarray.shape数组的维度,对于矩阵,n 行 m 列
ndarray.size数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtypendarray 对象的元素类型
ndarray.ravel可将多维数组展平,转为一维。

      注:ndarray.shape 返回一个包含数组维度的元组,对于矩阵,n 行 m 列,它也可以用于调整数组维度。
示例代码:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape)
b.shape = (3, 2)
print(a)
print(b)

输出:

(2, 3)
[[1 2]
 [3 4]
 [5 6]]

      NumPy 也提供了reshape() 函数来调整数组维度。只是 reshape() 返回调整维度后的副本,而不改变原 ndarray。

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.reshape(3, 2)
print(b)  # a 没变

输出:

[[1 2]
 [3 4]
 [5 6]]

ndarray.ndim返回数组的维度(秩)。

import numpy as np

a = np.arange(24)
print(a.ndim)

# 现在调整其大小
b = a.reshape(2, 4, 3)
print(b.ndim)

输出:

1
3

ndarray.size 的功能为计算数组元素的总个数,相当于 .shape 中 n*m 的值。

import numpy as np

a = np.array([[1.0,1.0,1.0],[1.0,1.0,1.0]])
print(a.size)

输出:

6

ndarray.dtype的功能为返回数组元素的数据类型:

import numpy as np

a = np.array([[1.0,1.0,1.0],[1.0,1.0,1.0]])
print(a.dtype)

输出:

float64

ndarray.ravel的功能为,将高维数组转化为1维数组:

import numpy as np

a = np.array([[1.0,1.0,1.0],[1.0,1.0,1.0]])
print(a.ravel())

输出:

[1. 1. 1. 1. 1. 1.]

(3)NumPy 创建数组

numpy.zeros 创建指定维度,以 0 填充的新数组。

numpy.zeros(shape, dtype=float, order='C')

numpy.ones创建指定维度,以 1 填充的新数组。

numpy.ones(shape, dtype=float, order='C')

numpy.full返回给定维度和类型的新数组,填充 fill_value。

numpy.full(shape, fill_value, dtype=None, order='C')

(4)NumPy 数组数据类型及转化
首先,numpy数据类型共有:
在这里插入图片描述
显示数据类型及类型转换:

>>> import numpy as np
>>> arr=np.array([1,2,3,4,5])
>>> arr.dtype
dtype('int32')
>>> float_arr=arr.astype(np.float64)
>>> float_arr
array([1., 2., 3., 4., 5.])
>>> float_arr.dtype
dtype('float64')

>>> arr_string=np.array(['1.24','2.6','21'],dtype=np.string_)
>>> arr_string.astype(float)
array([ 1.24,  2.6 , 21.  ])

注意:

1.使用numpy.string_类型时,一定要小心,因为NumPy的字符串数据是大小固定的,发生截取时,不会发出警告。pandas提供了更多非数值数据的便利的处理方法。

2.调用astype总会创建一个新的数组(一个数据的备份),即使新的dtype与旧的dtype相同。

二、三类容器的区别

      该部分内容,主要是从用法及含义上来辨析三类容器的区别。

   1、list列表与numpy数组

      Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。使用Python列表可以存储一维数组,通过列表的嵌套可以实现多维数组,那么为什么还需要使用Numpy呢?Numpy是专门针对数组的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。通常Numpy数组中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以在通用性能方面Numpy数组不及Python列表,但在科学计算中,可以省掉很多循环语句,代码使用方面比Python列表简单的多。
列表转为数组:
(1)转成数组的matrix对象,使用np.mat()方法。


In [1]: a = [[2,3,4],[4,7,1]]                                                                                                                                                                 
 
In [2]: np.mat(a)                                                                                                                                                                             
Out[2]: 
matrix([[2, 3, 4],
        [4, 7, 1]])

(2)转成数组的ndarray对象,使用np.array()方法。


In [1]: a = [[2,3,4],[4,7,1]]  
In [2]: np.array(a)                                                                                                                                                                           
Out[2]: 
array([[2, 3, 4],
       [4, 7, 1]])

数组转列表:
      numpy中的数组和矩阵转换为列表需要注意用tolist()方法,如果用list()函数则会构造出一个新的列表,此列表的元素是原来的数组或矩阵了。

>>> matrix_1 = np.mat([[7, 8, 9], [0, 5, 3]])
>>> matrix_1
matrix([[7, 8, 9],
        [0, 5, 3]])
>>> #矩阵转化为数组
>>> array_1 = np.array(matrix_1)
>>> array_1
array([[7, 8, 9],
       [0, 5, 3]])
>>> #矩阵转化为列表
>>> list_1 = matrix_1.tolist()
>>> list_1
[[7, 8, 9], [0, 5, 3]]
 
>>> list_1 = list(matrix_1)
>>> list_1
[matrix([[7, 8, 9]]), matrix([[0, 5, 3]])]


>>> array_2 = np.array([[1, 5, 9], [3, 5, 7]])
>>> array_2
array([[1, 5, 9],
       [3, 5, 7]])
>>> #数组转化为矩阵
>>> matrix_2 = np.mat(array_2)
>>> matrix_2
matrix([[1, 5, 9],
        [3, 5, 7]])
>>> #数组转化为列表
>>> list_2 = array_2.tolist()
>>> list_2
[[1, 5, 9], [3, 5, 7]]
 
>>> list_2 = list(array_2)
>>> list_2
[array([1, 5, 9]), array([3, 5, 7])]

   2、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命令 。
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值