HOWTO · NumPy

使用 numpy.newaxis 为 NumPy 数组添加轴

numpy.newaxis 可用于向 Python 中的 NumPy 数组添加新维度。

本页内容

在索引表达式中使用 numpy.newaxis,可以为数组添加一个长度为 1 的轴。将它放在现有轴之前可得到行,放在该轴之后则可得到列。对于形状为 (4,) 的一维数组,这两种写法分别得到 (1, 4) 和 (4, 1)。原有值的顺序保持不变;索引通过插入一个轴来改变数组的形状。

使用 numpy.newaxis 为 NumPy 数组添加轴

在 NumPy 索引中,numpy.newaxis 是 Python 对象 None 的别名。它不是需要加括号调用的方法。numpy.newaxis 文档介绍了这个索引常量。在索引中,array[np.newaxis, :] 会将新轴放在最前面,而 array[:, np.newaxis] 会将新轴放在原轴之后。冒号表示保留原轴上的所有值。

安装 NumPy 后运行此示例:

import numpy as np

values = np.array([1, 2, 3, 4])
print(values.shape)

row = values[np.newaxis, :]
column = values[:, np.newaxis]
print(row.shape)
print(column.shape)
(4,)
(1, 4)
(4, 1)

第一个形状表示有一个轴,该轴包含四个元素。对于行形式,插入的第一个轴长度为 1,原轴长度仍为 4。对于列形式,包含四个元素的原轴排在前面,插入的轴长度为 1。因此形状分别是 (1, 4) 和 (4, 1):形状中的各项按轴的顺序排列,并不表示值集合发生了变化。二维形状本身不会让数据变成某种特殊的矩阵类型;NumPy 仍将其表示为数组。

也可以用 None 写出相同的两个索引:values[None, :] 会得到行的形状,values[:, None] 会得到列的形状。选择更能让周围代码清晰易懂的写法即可。numpy.newaxis 也可以为已有多个维度的数组添加轴。它在索引中的位置决定新长度为 1 的轴在结果形状中的位置;在依赖后续操作之前,请对照索引位置检查形状。

当其他操作需要维度相互对齐时,添加轴会很有用,其中包括某些广播操作。新增轴的长度为 1;当其他维度兼容时,广播可以扩展这一维,但添加轴并不会自动让任意两个数组都兼容。选择行形式还是列形式时,应先关注结果形状以及下一步操作所需的轴顺序。这样更容易推理索引的效果,也能避免误以为这两种形式可以互换。

对于形状为 (2, 3) 的数组,matrix[:, :, None] 会在末尾添加一个轴,得到形状 (2, 3, 1);matrix[None, :, :] 则会在开头添加一个轴,得到 (1, 2, 3)。两种情况下,原有两个轴的顺序和长度都保持不变。使用多个索引位置时,可以写下原始形状,并标出每个 None 或 numpy.newaxis 所在的位置;这样在将数组传给其他函数之前,就能预测新的形状。