Python NumPy数组的创建和使用(附带实例)
Ndarray 是 NumPy 的核心对象,该对象表示一维或多维数组,为了使本节中的示例代码正常运行,需要在每个示例代码的开头添加以下代码:
将一个整数作为参数传递给 arange() 函数时,将创建一个从 0 到比该整数小 1 的值组成的一维数组。下面的代码创建由 0、1 和 2 三个元素组成的一维数组:
如果希望数组的第一个元素不是 0,则可以为 arange() 函数同时传递两个参数,第一个参数用于指定第一个元素的值。下面的代码创建由 1 和 2 两个元素组成的一维数组:
如果为 arange() 函数传递第 3 个参数,则创建的数组中的各个元素之间具有指定的间隔。下面的代码创建由 1~10 的所有偶数组成的数组:
在交互模式中运行上面的代码,将显示以下结果:
如果不想在运行结果中显示 array,则可以使用 Python 中的 print() 函数,代码如下:
在 NumPy 中,还可以使用 array() 函数将 Python 中的序列对象创建为数组。下面的代码将一个列表作为参数传递给 array() 函数,将其创建为一维数组:
传递给 array() 函数的参数也可以是引用序列对象的变量:
如需创建在指定数值范围内的等差数列的数组,可以使用 linspace() 函数。该函数的前两个参数用于指定值的范围,第三个参数用于指定值的数量,即数组包含的元素个数。
下面的代码是创建包含 3 个元素的一维数组,这 3 个元素都是 1~10 的数字,且两个相邻元素的差值是 4.5:
代码的运行结果如下,任意两个相邻元素的差值都是 4.5:
下面的代码创建一个二维数组,该数组的第一维包含两个元素(即两个子列表),第二维包含 3 个元素(即每个列表中的 3 个数字)。如果将该数组看作表格,则该表格有 2 行 3 列。
使用 NumPy 中的 random() 函数可以创建一个包含 0~1 的随机数的二维数组,该函数位于 NumPy 库的 random 模块中。将一个元组作为参数传递给 random() 函数,该元组中的值表示二维数组的行数和列数。
下面的代码是创建一个 2 行 3 列的二维数组:
创建的数组如下,每次运行相同的代码会得到不同的随机数:
下面的代码将包含 6 个元素的一维数组转换为 2 行 3 列的二维数组:
即使转换后的数组只有一行,它也是一个二维数组。
reshape() 方法不会改变原数组的维数,当将创建的数组赋值给变量时,然后对该变量使用 reshape() 方法转换数组时,即可证实这种情况。
如需修改原数组的维数,可以使用 Ndarray 对象的 shape 属性。下面的代码是实现与前面示例相同的功能,但是使用的是 shape 属性,将一个表示数组行、列数的元组赋值给该属性。
下面的代码是先创建一个二维数组,然后使用 ndim 属性查看该数组的维数,该属性的返回值是 2,表示该数组有两个维度,是一个二维数组。
使用 Ndarray 对象的 shape 属性,可以查看数组的形状,即数组每个维度包含的元素数。下面的代码是查看上面创建的 numbers 数组的形状:
由于 numbers 数组有 2 行 3 列,所以将以元组的形式返回以下结果:
如需查看数组包含的元素总数,可以使用 Ndarray 对象的 size 属性。下面的代码是查看 numbers 数组包含的元素总数,由于该数组有 2 行 3 列,所以元素总数是 2×3=6。
下面的代码是先创建包含 0、1 和 2 三个元素的数组,然后将该数组的第 2 个元素的值修改为 666:
代码的运行结果如下,由于第 2 个元素是 3 位数,所以 NumPy 会自动使用空格将该数组中的其他元素补足到 3 位:
可以一次性修改多个元素的值,此时需要将这些元素的索引添加到一个列表中,然后使用该列表对数组进行索引。下面的代码是将数组中的第 1 个元素和第 3 个元素的值分别修改为 666 和 888。也可以使用一个变量引用列表,然后在数组名右侧的中括号中使用变量名代替列表。
下面的代码是创建一个 2 行 3 列的数组:
使用 T 属性将该数组转换为 3 行 2 列:
使用 Ndarray 对象的 transpose() 函数也可以实现相同的功能:
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)以上两种方法都不会将原数组修改为转置后的数组。