📜  Python – 内置数组与 NumPy 数组

📅  最后修改于: 2022-05-13 01:54:32.326000             🧑  作者: Mango

Python – 内置数组与 NumPy 数组

让我们首先关注内置数组模块。内置数组模块定义了一种对象类型,可以有效地表示基本值数组:字符、整数、浮点数。数组是序列类型,其行为与列表非常相似,只是其中存储的对象类型受到限制。
这意味着存储在数组中的对象是同质(相同)类型。要存储在数组(内置)中的对象类型由类型码确定。类型代码是单个字符。
在数组模块中“array(typecode [, initializer])”返回一个数组。其中初始化程序是可选的,如果提供,它必须是列表、字符串或可迭代的。
代码:

Python3
import array as built_in
array1 = built_in.array('i')
array1.append(1)
array1.append(2)
print(array1)


Python3
import array as built_in
array1 = built_in.array('i', [1, 2])
array1.append(3)
array1.append(4)
print(array1)


Python3
import numpy
array1 = numpy.array([1, 2, 3])
print(array1)


Python3
import numpy
array1 = numpy.array([1, 2, 3], int)
print(array1, type(array1[0]))


Python3
import numpy
array1 = numpy.array([1.5, 2.5], int)
print(array1, type(array1[0]), type(array1[1]))


Python3
import numpy
array1 = numpy.array([1.5, 2.5], str)
print(array1, type(array1[0]), type(array1[1]))


Python3
import array as built_in
array1 = built_in.array('i', [1, 2])
print(array1)
print(array1.typecode)
print(array1.itemsize)


输出:

array('i', [1, 2])

使用内置数组模块时,在创建数组时是否提供初始化器(初始化器是可选的)是程序员的调用。在前面代码的第 2 行,类型代码是“i” ,我们没有提供任何初始化程序,只是在数组的末尾一个接一个地附加了 1、2。

在这里,我们确实提供了一个 int 值 1 的初始化程序。发生错误,因为初始化程序必须是可迭代的,而整数是不可迭代的。

即使我们这次确实提供了可迭代的初始化器(列表)。但是数组最多需要 2 个参数。这里提供 2 个初始化器,总共给数组 3 个参数,导致“TypeError”。
代码:

Python3

import array as built_in
array1 = built_in.array('i', [1, 2])
array1.append(3)
array1.append(4)
print(array1)

输出:

array('i', [1, 2, 3, 4])

提供一个可在元素上迭代的初始化程序(最多 1 个)会导致代码的无错误执行。

这里给数组的类型代码表明,存储在数组中的对象必须是“int”类型。试图在数组中存储浮点值,导致 TypeError。

这里给数组的类型代码表明存储在数组中的对象必须是 Unicode字符。试图在数组中存储浮点值,导致 TypeError。注意:内置数组模块没有隐式类型转换数据(从浮点数到整数) Python中的numpy模块通常用于矩阵和数组计算。使用 numpy 模块时,内置函数“array”用于创建数组。数组函数的原型是


除了对象之外,一切都是可选的。并且对象是一个数组,任何暴露数组接口的对象,一个其__array__方法返回一个数组或任何(嵌套)序列的对象。 dtype 是数组所需的数据类型。
代码:

Python3

import numpy
array1 = numpy.array([1, 2, 3])
print(array1)

输出:

[1 2 3]

除 object 之外的所有其他参数在 numpy 模块的 array函数中都是可选的。因此,即使我们没有传递其他参数,也没有错误。
代码:

Python3

import numpy
array1 = numpy.array([1, 2, 3], int)
print(array1, type(array1[0]))

输出:

[1 2 3] 

这里我们明确告诉Python ,存储在数组中的所有对象都应该被类型转换为int (如果可能的话)。

这里Python将1作为参数'object'的参数,将2作为参数'datatype'的参数,因此Python无法理解数据类型或解释数据类型。
代码:

Python3

import numpy
array1 = numpy.array([1.5, 2.5], int)
print(array1, type(array1[0]), type(array1[1]))

输出:

[1 2]  

这里浮点数据被转换为 int,当所需的数组数据类型为 int 时,小数点后的数据会丢失。
代码:

Python3

import numpy
array1 = numpy.array([1.5, 2.5], str)
print(array1, type(array1[0]), type(array1[1]))

输出:

['1.5' '2.5']  

这里浮点数据被转换成一个字符串。请记住,在内置数组模块中,当数组的所需数据类型是 int 并且浮点值被传递给数组时。发生 TypeError 'integer argument expected got float' 。当所需的数组数据类型为类型码'u'指定的 Unicode字符时,内置数组模块,并将浮点值发送到数组。 TypeError 发生'数组项必须是 Unicode字符'。但是在 numpy 数组中,当所需的数组数据类型是 int 并且浮点值被发送到数组时。浮点值被类型转换为 int (小数点后数据丢失),当所需的数组数据类型是字符串并且浮点值被发送到数组时,浮点值被类型转换为字符串。
这是内置数组模块和 numpy 数组之间的主要区别。内置数组对对象本身的存储非常严格。它只允许将那种类型的数据存储在自身中,这已由类型代码严格指定。当 typecode 指定 int 数据必须存储在内置数组中时,我们无法存储浮点值。然而 numpy 数组在这方面有点宽容或宽容,它会向上或向下转型并尝试不惜一切代价存储数据。 (浮点数被转换为整数,即使这会导致小数点后的数据丢失)
注意:内置数组具有 typecode 和 itemsize 等属性

代码:

Python3

import array as built_in
array1 = built_in.array('i', [1, 2])
print(array1)
print(array1.typecode)
print(array1.itemsize)

输出:

array('i', [1, 2])
i
4

这里类型代码“i”指定存储在数组中的对象将是有符号整数类型。
例外: - 在 numpy 数组中,当数组的所需数据类型显式指定为 int 或 float 时,然后将字符串发送到数组。会发生 ValueError 是因为实际上不可能向上转换或向下转换
不惜任何代价将字符串浮动或整数。