List (列表)是 Python 中最基本的数据结构。在用法上,它有点类似数组,因为每个列表都有一个下标,下标从 0 开始。因此,我们可以使用 list[1] 来获取下标对应的值。如果我们深入下列表的底层原理,会发现列表是基于 PyListObject 实现的。PyListObject 是一个变长对象,所以列表的长度是随着元素多少动态改变的。同时它还支持插入和删除等操作,所以它还是一个可变对象。

可以简单理解为,Python 的列表是长度可变的数组。一般而已,我们用于列表创建都是一维数组。那么问题来,我们如果创建多维数组呢?

01 列表能创建多维数组?

列表是支持操作符,如果一个列表与 ‘ * ’ 号结合使用,能达到重复列表的效果。比如

list_one = [0]
list_two = [0] * 3
print(list_one)
print(list_two)>>> 运行结果:[0]
[0, 0, 0]

那么利用这个重复特性,我们是否可以来创建一个二维数组呢?于是乎,我进行一顿猛操作,结果就被我折腾出来了。

list_one = [0]
list_two = [[0] * 3] * 3
print(list_one)
print(list_two)>>> 运行结果:[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

看起来很完美的操作,但是如果进行一些列表更新操作,问题就显露出来了。比如我对 list_two 的更换中间位置的值,即对 list_two[1][1] 进行更换值。

list_two = [[0] * 3] * 3
print(list_two)list_two[1][1] = 2
print(list_two)

不难发现,运行结果有点不对劲,列表中有三个位置的值也改变了。

[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 2, 0], [0, 2, 0], [0, 2, 0]]

为什么会出现在这种情况呢?原因是浅拷贝,我们以这种方式创建的列表,list_two 里面的三个列表的内存是指向同一块,不管我们修改哪个列表,其他两个列表也会跟着改变。

如果要使用列表创建一个二维数组,可以使用生成器来辅助实现。

list_three = [[0 for i in range(3)] for j in range(3)]
print(list_three)
list_three[1][1] = 3
print(list_three)

我们对 list_three 进行更新操作,这次就能正常更新了。

[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 3, 0], [0, 0, 0]]

除了以上的方式,还有一种更加简洁方便的方式,就是使用 NumPy 模块。

02 相比 List,NumPy 数组的优势

NumPy 全称为 Numerical Python,是 Python 的一个以矩阵为主的用于科学计算的基础软件包。NumPy 和 Pandas、Matpotlib 经常结合一起使用,所以被人们合称为数据分析三剑客。Numpy 中有功能强大的 ndarray 对象,能创建 N 维的数组,另外还提供很多通用函数,支持对数组的元素进行操作、支持对数组进行算法运算以及提供常用的统计函数。

相比 List 对象,NumPy 数组有以下优势:

  1. 这是因为列表 list 的元素在系统内存中是分散存储的,而 NumPy 数组存储在一个均匀连续的内存块中。这样数组计算遍历所有元素,不像列表 list 还需要对内存地址进行查找,从而节省了计算资源。
  2. Numpy数组能够运用向量化运算来处理整个数组,速度较快;而 Python 的列表则通常需要借助循环语句遍历列表,运行效率相对来说要差。
  3. NumPy 中的矩阵计算可以采用多线程的方式,充分利用多核 CPU 计算资源,大大提升了计算效率。
  4. Numpy 使用了优化过的 C API,运算速度较快。

03 创建数组

前面说到 NumPy 的主要对面是 ndarray 对象,它其实是一系列同类型数据的集合。因为 ndarray 支持创建多维数组,所以就有两个行和列的概念。

创建 ndarray 的第一种方式是利用 array 方式。

import numpy as np
# 创建一维数组
nd_one = np.array([1, 2, 3])
# 创建二维数组
nd_two = np.array([[1, 2, 3], [4, 5, 6]])print(nd_one)
print(nd_two)
print('nd_two.shape =', nd_one.shape)
print('nd_two.shape =', nd_two.shape)>>> 运行结果:[1 2 3]
[[1 2 3][4 5 6]]
nd_two.shape = (3,)
nd_two.shape = (2, 3)

其中 shape 是数组的一个属性,表示获取数组大小(有多少行,有多少列),如果是一维数组,则只显示(行,)。代码中打印出 nd_two 的形状,输出为(2,3),表示数组中有 2 行 3 列。

第二种办法则使用 Numpy 的内置函数

  • 1 使用arange 或 linspace 创建连续数组。
```python
import numpy as np
# arange() 类似Python内置函数的 range()
# arange(初始值, 终值, 步长) 不包含终值
x0 = np.arange(1, 11, 2)
print(x0)# 创建一个 5x3 的数组
x1 = np.arange(15).reshape((5, 3))
print(x1)# linspace()线性等分向量
# linspace(初始值, 终值, 元素个数) 包含终值
x2 = np.linspace(1, 11, 6)
print(x2)>>> 运行结果:[1 3 5 7 9][[ 0  1  2][ 3  4  5][ 6  7  8][ 9 10 11][12 13 14]][  1.   3.   5.   7.   9.  11.]

虽然 np.arangenp.linspace 起到的作用是一样的,都是创建等差数组,但是创建的方式是不同的。

  • 2 使用 zeros(),ones(),full() 创建数组
import numpy as np
# 创建一个 3x4 的数组且所有值全为 0
x3 = np.zeros((3, 4), dtype=int)
print(x3)
# 创建一个 3x4 的数组且所有元素值全为 1
x4 = np.ones((3, 4), dtype=int)
print(x4)
# 创建一个 3x4 的数组,然后将所有元素的值填充为 2
x5 = np.full((3, 4), 2, dtype=int)
print(x5)>>> 运行结果:[[0 0 0 0][0 0 0 0][0 0 0 0]][[1 1 1 1][1 1 1 1][1 1 1 1]][[2 2 2 2][2 2 2 2][2 2 2 2]]

  • 3 使用 eye() 创建单位矩阵

eye() 创建的数组特点是行数和列数都是一样。因为它创建出来的是单位矩阵,单位矩阵是正形矩阵,对角线的值均为 1,其他位置的值为 0。

import numpy as np
# 创建 3x3 的单位矩阵
x6 = np.eye(3, dtype=int)
print(x6)>>> 运行结果:[[1 0 0][0 1 0][0 0 1]]

  • 4 使用 diag() 创建对角矩阵

diag() 是创建一个 NxN 的对角矩阵,对角矩阵是对角线上的主对角线之外的元素皆为 0 的矩阵。

import numpy as np
x7 = np.diag([1, 2, 3])
print(x7)>>> 运行结果:[[1 0 0][0 2 0][0 0 3]]

  • 5 使用 random 创建随机数组

numpy 中的 random 中有很多内置函数,能简单介绍其中的几种。

import numpy as np
# 创建 2x2 数组且所有值是随机填充
x9 = np.random.random((2, 2))
print(x9)# 创建一个值在 [0, 10) 区间的 3x3 的随机整数
x10 = np.random.randint(0, 10, (3, 3))
print(x10)>>> 运行结果:[[ 0.77233522  0.41516417][ 0.22350126  0.31611254]][[0 6 5][7 6 4][5 5 9]]

本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享

「极客猴」每周坚持分享 Python 原创干货的公众号。包括基础入门,进阶技巧,网络爬虫,数据分析, Web 应用开发等,欢迎关注。

python 随机获取数组元素_Python创建二维数组的正确姿势相关推荐

  1. python 二维数组 长度_Python创建二维数组的正确姿势

    ↑↑↑点击上方"蓝字",关注"极客猴" 如果你喜欢极客猴,可以把我置顶或加为星标 题图:by watercolor.illustrations from Ins ...

  2. jupyter notebook多维数组运算_Python创建二维数组的正确姿势

    List (列表)是 Python 中最基本的数据结构.在用法上,它有点类似数组,因为每个列表都有一个下标,下标从 0 开始.因此,我们可以使用 list[1] 来获取下标对应的值.如果我们深入下列表 ...

  3. python创建矩阵_Python创建二维数组的正确姿势

    List (列表)是 Python 中最基本的数据结构.在用法上,它有点类似数组,因为每个列表都有一个下标,下标从 0 开始.因此,我们可以使用 list[1] 来获取下标对应的值.如果我们深入下列表 ...

  4. python创建二维数组的方法_Python创建二维数组的正确姿势

    本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享 List (列表)是 Python 中最基本的数据结构.在用法上,它有点类似数组,因为每个列表都有一个下标,下标从 0 开始.因此 ...

  5. 交换二维数组元素c语言,二维数组中元素替换问题!

    二维数组中元素替换问题! 题目:对某个二维数组右上三角的全部元素(不包括对角线上的元素)做如下变换: (1)若该数是偶数,则找到左下三角中和它关于对角线对称的元素用这两个元素的最大公约数替换该数 (2 ...

  6. python怎么创建一个二维数组_python 创建二维数组的方法

    废话不多说,直接上代码: #coding=utf-8 def two_di_demo1(): a=[] for i in range(10): a.append([]) for j in range( ...

  7. python画二维数组散点图_Python散点图二维数组

    我在努力做一些我认为应该很直截了当的事情,但我似乎无法让它起作用. 我试着绘制16字节的值,看看它们是如何变化的.我想用散点图来处理: x轴为测量指标 y轴是字节的索引 以及表示字节值的颜色. 我把数 ...

  8. C++中创建二维数组的四种方法

    目录 使用一维数组模型二维数组 静态二维数组 动态二维数组 利用vector创建二维数组 #include <iostream> #include <vector>using ...

  9. python创建一个n*m的二维数组_Python中创建二维数组

    Python中创建二维数组 二维数组 二维数组本质上是以数组作为数组元素的数组,即"数组的数组",类型说明符 数组名[常量表达式][常量表达式].二维数组又称为矩阵,行列数相等的矩 ...

最新文章

  1. Spring Boot使用Druid和监控配置
  2. Qt程序单次启动(QSingleApplication类)
  3. cocoapod卡在了analyzing dependencies
  4. Nginx负载均衡策略之ip_hash
  5. GridView RowCommand事件中取得當前行
  6. Integer包装类特殊之处
  7. C++ 标准库 书籍学习记录笔记 第5章
  8. 怎么控制ajax执行先后顺序,[转]多个ajax请求时控制执行顺序或全部执行后的操作...
  9. Linux下的磁盘分区与加密
  10. 310. 最小高度树
  11. ElasticSearch 2 (11) - 节点调优(ElasticSearch性能)
  12. Atitit 四种自动机 fsm pda 目录 1. 自动机可分为有限自动机、后进先出自动机、线性有界自动机、图灵机等几种。它们对语言的识别能力各不相同。 2 1.1. 抽象自动机的理论。 2 1.
  13. Pisa-Proxy SQL 解析之 Lex Yacc
  14. [渝粤教育] 北京理工大学 工程热力学 参考 资料
  15. java调用 火眼臻睛,火眼臻睛车牌识别SDK评测
  16. 什么是JSX、是如何使用以及注意事项
  17. Packet Tracer 思科模拟器入门教程 之十一 路由器静态路由配置
  18. Windows安装MySql
  19. ArcGISPro通视分析之视线分析
  20. 3.5亿!创维电视董事长双11直播带货,哪些细节值得借鉴?

热门文章

  1. 题解 luogu P2568 GCD
  2. 几个so经常使用Function
  3. Bootstrap学习笔记(四)-----Bootstrap每天必学之表单
  4. 【SHARE】WEB前端学习资料
  5. Maven项目 之eclipse操作篇
  6. OPENCV-2 学习笔记
  7. 24 React.createRef()用法细节分析
  8. 基于centos6.7的docker私有仓库搭建
  9. 苏宁海量服务器自动化配置运维实践
  10. ImportError: No module named 'chardet'