首页 > 编程笔记 > Python笔记 阅读:15

Python NumPy数组的创建和使用(附带实例)

Ndarray 是 NumPy 的核心对象,该对象表示一维或多维数组,为了使本节中的示例代码正常运行,需要在每个示例代码的开头添加以下代码:
import numpy as np
Python 中导入 NumPy 库,并将其别名设置为 np,本节中的每个示例都使用该别名。

NumPy创建一维数组

使用 NumPy 中的 arange() 函数可以创建一维数组,该函数的用法与 Python 中的 range 函数类似。

将一个整数作为参数传递给 arange() 函数时,将创建一个从 0 到比该整数小 1 的值组成的一维数组。下面的代码创建由 0、1 和 2 三个元素组成的一维数组:
np.arange(3)

如果希望数组的第一个元素不是 0,则可以为 arange() 函数同时传递两个参数,第一个参数用于指定第一个元素的值。下面的代码创建由 1 和 2 两个元素组成的一维数组:
np.arange(1, 3)

如果为 arange() 函数传递第 3 个参数,则创建的数组中的各个元素之间具有指定的间隔。下面的代码创建由 1~10 的所有偶数组成的数组:
np.arange(2, 11, 2)

在交互模式中运行上面的代码,将显示以下结果:
array([2, 4, 6, 8, 10])

如果不想在运行结果中显示 array,则可以使用 Python 中的 print() 函数,代码如下:
print(np.arange(2, 11, 2))

这种问题在脚本模式中不存在,因为在脚本模式中编写要将结果显示在屏幕上的代码时,必须使用 print() 函数。后面的示例将省略 print() 函数,以便减少代码的复杂性。


在 NumPy 中,还可以使用 array() 函数将 Python 中的序列对象创建为数组。下面的代码将一个列表作为参数传递给 array() 函数,将其创建为一维数组:
np.array([1, 2, 3])

传递给 array() 函数的参数也可以是引用序列对象的变量:
numbers = [1,2,3]
np.array(numbers)

如需创建在指定数值范围内的等差数列的数组,可以使用 linspace() 函数。该函数的前两个参数用于指定值的范围,第三个参数用于指定值的数量,即数组包含的元素个数。

下面的代码是创建包含 3 个元素的一维数组,这 3 个元素都是 1~10 的数字,且两个相邻元素的差值是 4.5:
np.linspace(1, 10, 3)

代码的运行结果如下,任意两个相邻元素的差值都是 4.5:

[ 1. 5.5 10. ]

NumPy创建二维数组

使用 array() 函数可以创建二维数组,只需将一个嵌套列表作为参数传给该函数即可。

下面的代码创建一个二维数组,该数组的第一维包含两个元素(即两个子列表),第二维包含 3 个元素(即每个列表中的 3 个数字)。如果将该数组看作表格,则该表格有 2 行 3 列。
np.array([[1, 2, 3], [7, 8, 9]])
上述代码将创建以下数组:

[[1 2 3]
[7 8 9]]


使用 NumPy 中的 random() 函数可以创建一个包含 0~1 的随机数的二维数组,该函数位于 NumPy 库的 random 模块中。将一个元组作为参数传递给 random() 函数,该元组中的值表示二维数组的行数和列数。

下面的代码是创建一个 2 行 3 列的二维数组:
np.random.random((2, 3))

创建的数组如下,每次运行相同的代码会得到不同的随机数:
[[0.53631257 0.02745073 0.15569723]
[0.72433551 0.36637602 0.13712715]]

NumPy将一维数组转换为二维数组

使用 Ndarray 对象的 reshape() 方法,可以在使用 arange() 函数创建一维数组时,直接将其转换为指定行、列数的二维数组。

下面的代码将包含 6 个元素的一维数组转换为 2 行 3 列的二维数组:
np.arange(6).reshape(2,3)
上述代码将创建以下数组:

[[0 1 2]
[3 4 5]]


即使转换后的数组只有一行,它也是一个二维数组。
np.arange(6).reshape(1, 6)
上述代码将创建以下数组:

[[0 1 2 3 4 5]]


reshape() 方法不会改变原数组的维数,当将创建的数组赋值给变量时,然后对该变量使用 reshape() 方法转换数组时,即可证实这种情况。

如需修改原数组的维数,可以使用 Ndarray 对象的 shape 属性。下面的代码是实现与前面示例相同的功能,但是使用的是 shape 属性,将一个表示数组行、列数的元组赋值给该属性。
np.arange(6).shape =(2, 3)
或:
np.arange(6).shape = 2, 3

NumPy查看数组的维数和元素数

使用 Ndarray 对象的 ndim 属性,可以查看数组的维数。

下面的代码是先创建一个二维数组,然后使用 ndim 属性查看该数组的维数,该属性的返回值是 2,表示该数组有两个维度,是一个二维数组。
numbers = np.arange(6).reshape(2, 3)
numbers.ndim

使用 Ndarray 对象的 shape 属性,可以查看数组的形状,即数组每个维度包含的元素数。下面的代码是查看上面创建的 numbers 数组的形状:
numbers.shape

由于 numbers 数组有 2 行 3 列,所以将以元组的形式返回以下结果:
(2, 3)

如需查看数组包含的元素总数,可以使用 Ndarray 对象的 size 属性。下面的代码是查看 numbers 数组包含的元素总数,由于该数组有 2 行 3 列,所以元素总数是 2×3=6。
numbers.size

NumPy修改数组元素的值

与修改 Python 列表中元素的值的方法类似,如需修改 NumPy 数组中元素的值。可以将该元素的索引放到数组名右侧的一对中括号中,然后在等号的右侧输入修改后的值。

下面的代码是先创建包含 0、1 和 2 三个元素的数组,然后将该数组的第 2 个元素的值修改为 666:
numbers = np.arange(3)
numbers[1] = 666

代码的运行结果如下,由于第 2 个元素是 3 位数,所以 NumPy 会自动使用空格将该数组中的其他元素补足到 3 位:
[ 0 666  2]
注意,数组中所有元素的数据类型都必须相同,修改元素时,如果为其赋值的数据类型与其他元素的数据类型不同,则将导致错误。

可以一次性修改多个元素的值,此时需要将这些元素的索引添加到一个列表中,然后使用该列表对数组进行索引。下面的代码是将数组中的第 1 个元素和第 3 个元素的值分别修改为 666 和 888。也可以使用一个变量引用列表,然后在数组名右侧的中括号中使用变量名代替列表。
numbers = np.arange(3)
numbers[[0, 2]] = 666, 888
修改后的数组如下:
[666  1 888]

NumPy转置数组的行和列

使用 Ndarray 对象的T属性,可以将数组的行转换为列,将数组的列转换为行。

下面的代码是创建一个 2 行 3 列的数组:
numbers = np.arange(6).reshape(2, 3)
[[0 1 2]
[3 4 5]]

使用 T 属性将该数组转换为 3 行 2 列:
numbers.T
[[0 3]
[1 4]
[2 5]]

使用 Ndarray 对象的 transpose() 函数也可以实现相同的功能:
np.transpose(numbers)
以上两种方法都不会将原数组修改为转置后的数组。

相关文章