python数组
在编程中,数组是相同类型的元素的集合。数组在Java,C / C ++,JavaScript等大多数编程语言中都很流行。但是,在Python中,它们并不常见。人们经常谈论Python数组时,他们谈论的是Python列表。
1.Delphi定义数组
ZCYL_sx :array[0..3] of double;
2.Python定义数组
(1)列表 的3种
我们可以将列表视为数组,但是,我们不能限制列表中存储的元素的类型:
a = [1, 3.5, "Hello"]
1)一维列表:
- 创建一个3个元素的整数数组,所有元素都初始化为0:
a = [0]*3
a = [0,0,0]
a = [0 for _ in range(3)] 推荐
这三种定义列表的方式都会得到相同的结果,都是定义一个包含三个整型数 0 的列表。然而,它们之间有微妙的区别:
a = [0]*3
这种方式使用了简单的乘法操作符
*
来复制元素,创建了一个包含三个整型数 0 的列表。这种方式非常简洁,但需要注意的是,它复制了对同一个整型数 0 的引用,因此这三个元素在内存中实际上是相同的,如果修改其中一个元素,其他元素也会跟着改变。a = [0,0,0]
种方式直接列出了三个整型数 0 ,以逗号分隔,创建了一个包含三个整型数 0 的列表。每个元素都是独立的,互不影响。
a = [0 for _ in range(3)]
这种方式使用列表推导式,在
for _ in range(3)
循环中重复生成了三个整型数 0,创建了一个包含三个整型数 0的列表。和第二种方式一样,每个元素都是独立的,互不影响。
2)多维列表:
- 创建一个5行3列的整数数组,所有元素都初始化为0:
a_list = [[0]*3 for _ in range(5)]
a_list = [[0, 0, 0] for _ in range(5)]
a_list = [[0 for _ in range(3)] for _ in range(5)]
# 结果:[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
同理,三种方式对应不同的区别。
(2)array.array
- array.array: 来自 Python 的 array 模块,它创建的数组是固定类型的数组,只能存储指定的数据类型;
- 在创建数组时,需要明确指定数组的类型,例如 'd' 表示 double 类型,'i' 表示 int 类型等;
- Python 的
array
模块提供的数组功能相对较简单,适用于简单的数值存储,不支持矢量化计算和广播运算;- 不需要额外的安装。您可以直接使用 import array
如果使用array模块创建数组 ,则数组的所有元素必须为相同的数字类型:
import array as arr
a = arr.array('d', [1.1, 3.5, 4.5])
print(a)
创建一个包含4个元素的 double 类型的数组,并初始化为空
import array as arr
a = arr.array('d', [0.0, 0.0, 0.0, 0.0])
print(a)
在这里,我们创建了一个float类型数组。字母'd'是类型代码。这确定了创建过程中数组的类型,常用的类型代码:
Code | C 类型 | Python 类型 | 最小字节 |
---|---|---|---|
'b' | signed char | int | 1 |
'B' | unsigned char | int | 1 |
'u' | Py_UNICODE | Unicode | 2 |
'h' | signed short | int | 2 |
'H' | unsigned short | int | 2 |
'i' | signed int | int | 2 |
'I' | unsigned int | int | 2 |
'l' | signed long | int | 4 |
'L' | unsigned long | int | 4 |
'f' | float | float | 4 |
'd' | double | float | 8 |
python数组知识详见:Python 数组 - 菜鸟教程 (cainiaojc.com)
(3)np.zeros
- np.zeros 来自 NumPy 库,它创建的数组是 NumPy 数组(numpy.ndarray),可以存储不同数据类型的元素,例如整数、浮点数、布尔值等;
- 可以通过指定参数 dtype 来设置数组的数据类型;
- NumPy 库提供了丰富的功能和数学运算,适用于科学计算和数据处理。您可以对 NumPy 数组进行矢量化计算,广播运算等;
- 需要确保安装了 NumPy 库pip install numpy,并且导入 import numpy as np
- 创建一个5行3列的整数数组,所有元素都初始化为0:
import numpy as np
a_list = np.zeros((5, 3), dtype=int)
'''
结果:
[[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]]
'''
你可以根据需要使用不同的整数类型,比如int8
、int16
、int32
、int64
等。只需将dtype
参数设置为相应的整数类型即可。
(4)数组清理
a = [1, 2, 3, 4, 5]
a[:] = []
# 输出:[]
a.clear() # 推荐
# 输出:[]
(5)总结
- 定义一维数组:
a = [0]*3 #方式 1
a = [0,0,0] #方式 2 短的,推荐
a = [0 for _ in range(3)] #方式 3 长的,推荐
# 输出:[0, 0, 0]
#-----------------------------------------
import array as arr
a = arr.array('b', [0, 0, 0]) #方式 4
# 输出:array('b', [0, 0, 0])
#-----------------------------------------
import numpy as np
a = np.array([]) # 定义一个空数组(空列表)
# 输出:[]
a = np.array([1, 2, 3, 4, 5]) # 定义一个数组
# 输出:[1 2 3 4 5]
总的来说,前两种方式创建的列表的元素是相同的,第三种方式创建的列表和前两种是等价的,但更具有灵活性,可以用于生成更复杂的列表。如果你想要一组互不影响的元素,最好使用列表推导式的方式。如果你想要复制同一个元素,可以使用乘法操作符的方式。
- 定义多维数组:
a_list = [[0]*3 for _ in range(5)] #方式 1
a_list = [[0, 0, 0] for _ in range(5)] #方式 2 短的,推荐
a_list = [[0 for _ in range(3)] for _ in range(5)] #方式 3 长的,推荐
# 输出:[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
#--------------------------------------------------------------------------------
a_list = np.zeros((5, 3), dtype=int) #创建一个5行3列的整数数组,所有元素都初始化为0 #方式 4 次之
'''
输出:
[[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]]
'''
综上所述,这两种方法都会创建一个包含5行3列的数组或列表,所有元素都被初始化为0,但第一种方法使用了NumPy库,第二种方法使用了Python的内置列表和列表推导式。NumPy数组在数值计算和高效的数组操作方面具有优势,因此在许多科学和数据相关任务中被广泛使用。然而,如果你不需要进行数值计算,而更喜欢简单的列表形式,第二种方法可能更合适。
3.Django框架定义数组
(1)ArrayField(依赖于 PostgreSQL 数据库)
- 来自 Django 框架的
ArrayField
,用于在 Django 模型中创建数据库字段的数组。- 只适用于 Django 项目,并用于数据库存储。
- 在数据库中存储的数组大小是可变的,并且要指定数组的数据类型。
- 适用于需要在 Django 模型中使用
size
参数,存储固定大小数组的情况。
from django.db import models
from django.contrib.postgres.fields import ArrayField
class MyModel(models.Model):
my_array = ArrayField(models.FloatField(), size=4)
PgSQL(也称为PostgreSQL)是一种开源的关系型数据库管理系统(RDBMS),它以可靠性、稳定性和功能丰富而闻名。它由一个全球开发者社区维护,并且可以在多个平台上运行,包括Windows、Linux和Mac OS。
注意:
1)Models类文件引入ArrayField
from django.db import models
from django.contrib.postgres.fields import ArrayField
# 假设TBase_Stope在另一个文件中定义
from path.to.tbase_stope import TBase_Stope
class TExp_Stope(TBase_Stope):
ZCYL_sx = ArrayField(models.FloatField(), size=4)
2)settings文件引入:
# settings.py
INSTALLED_APPS = [
# ...
'django_crontab', # 添加这行
# ...
]
3)安装相应包:
pip install django_crontab
pip install psycopg2 //因为 ArrayField 是依赖于 PostgreSQL 数据库的扩展功能。
(2)JSONField(支持PostgreSQL、MySQL、SQLite)
在 Django 3.1 及更高版本中,MySQL支持JSON字段。您可以使用 Django 的 JSONField
来存储包含数组数据的 JSON 对象。在这种情况下,您可以将数组数据序列化为 JSON 字符串并存储在 JSONField
中。Django 中定义一个元素为4个的数组:
from django.db import models
class MyModel(models.Model):
my_array = models.JSONField(default=list)
def __str__(self):
return str(self.my_array)
my_array_data = [1, 2, 3, 4] # 创建一个包含4个元素的数组
my_model_instance = MyModel.objects.create(my_array=my_array_data) # 创建 MyModel 实例并保存数组数据
my_model_from_db = MyModel.objects.get(pk=my_model_instance.pk) # 从数据库中获取保存的数据
print(my_model_from_db.my_array) # 输出:[1, 2, 3, 4]
(3)TextField
如果您的数组数据较为简单,您也可以使用 Django 的 TextField
来存储数组数据。在这种情况下,您可以将数组数据序列化为字符串,并将其存储在 TextField
中。
from django.db import models
class MyModel(models.Model):
my_array = models.TextField()
(4)CharField + validators
from django.db import models
from django.core.validators import RegexValidator
class MyModel(models.Model):
my_array = models.CharField(max_length=400, validators=[SizeValidator(4)])
我们使用SizeValidator
来确保该字段只包含4个元素,下面是SizeValidator
的一个简单实现:
class SizeValidator:
def __init__(self, size):
self.size = size
def __call__(self, value):
if value.count(',') != self.size - 1:
raise ValidationError(f"数组只能包含 {self.size} 个元素")
(5)列表,不定长
from django.db import models
class MyModel(models.Model):
my_list = models.TextField()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?