如何使用 np.newaxis?
- 2025-01-20 09:07:00
- admin 原创
- 106
问题描述:
它是什么?numpy.newaxis
我应该何时使用它?
在一维数组上使用它x
会产生:
>>> x
array([0, 1, 2, 3])
>>> x[np.newaxis, :]
array([[0, 1, 2, 3]])
>>> x[:, np.newaxis]
array([[0],
[1],
[2],
[3]])
解决方案 1:
简单来说,使用一次numpy.newaxis
,可将现有数组的维度增加一维。因此,
一维数组将变为二维数组
二维数组将变成三维数组
3D数组将变为4D数组
4D数组将变成5D数组
等等..
下面是一个直观的图示,描述了一维数组到二维数组的提升。
场景 1:np.newaxis
当您想要将 1D 数组明确转换为行向量或列向量时可能会派上用场,如上图所示。
例子:
# 1D array
In [7]: arr = np.arange(4)
In [8]: arr.shape
Out[8]: (4,)
# make it as row vector by inserting an axis along first dimension
In [9]: row_vec = arr[np.newaxis, :] # arr[None, :]
In [10]: row_vec.shape
Out[10]: (1, 4)
# make it as column vector by inserting an axis along second dimension
In [11]: col_vec = arr[:, np.newaxis] # arr[:, None]
In [12]: col_vec.shape
Out[12]: (4, 1)
场景 2:当我们想利用numpy 广播作为某些操作的一部分时,例如在添加某些数组时。
例子:
假设您要添加以下两个数组:
x1 = np.array([1, 2, 3, 4, 5])
x2 = np.array([5, 4, 3])
如果你尝试以这样的方式添加这些内容,NumPy 将引发以下问题ValueError
:
ValueError: operands could not be broadcast together with shapes (5,) (3,)
在这种情况下,您可以使用np.newaxis
增加其中一个数组的维度,以便 NumPy 可以广播。
In [2]: x1_new = x1[:, np.newaxis] # x1[:, None]
# now, the shape of x1_new is (5, 1)
# array([[1],
# [2],
# [3],
# [4],
# [5]])
现在,添加:
In [3]: x1_new + x2
Out[3]:
array([[ 6, 5, 4],
[ 7, 6, 5],
[ 8, 7, 6],
[ 9, 8, 7],
[10, 9, 8]])
或者,您也可以向数组添加新轴x2
:
In [6]: x2_new = x2[:, np.newaxis] # x2[:, None]
In [7]: x2_new # shape is (3, 1)
Out[7]:
array([[5],
[4],
[3]])
现在,添加:
In [8]: x1 + x2_new
Out[8]:
array([[ 6, 7, 8, 9, 10],
[ 5, 6, 7, 8, 9],
[ 4, 5, 6, 7, 8]])
注意:请注意,在两种情况下我们得到相同的结果(但一个是另一个的转置)。
场景 3:这与场景 1 类似。但是,你可以np.newaxis
多次使用来将数组提升到更高维度。对于高阶数组(即 Tensors),有时需要这样的操作。
例子:
In [124]: arr = np.arange(5*5).reshape(5,5)
In [125]: arr.shape
Out[125]: (5, 5)
# promoting 2D array to a 5D array
In [126]: arr_5D = arr[np.newaxis, ..., np.newaxis, np.newaxis] # arr[None, ..., None, None]
In [127]: arr_5D.shape
Out[127]: (1, 5, 5, 1, 1)
另外,您可以使用numpy.expand_dims
具有直观axis
kwarg 的。
# adding new axes at 1st, 4th, and last dimension of the resulting array
In [131]: newaxes = (0, 3, -1)
In [132]: arr_5D = np.expand_dims(arr, axis=newaxes)
In [133]: arr_5D.shape
Out[133]: (1, 5, 5, 1, 1)
有关np.newaxis与np.reshape的更多背景信息
newaxis
也称为伪索引,允许将轴临时添加到多数组中。
np.newaxis
使用切片运算符重新创建数组,同时numpy.reshape
将数组重塑为所需的布局(假设尺寸匹配;并且这是必须发生reshape
的)。
例子
In [13]: A = np.ones((3,4,5,6))
In [14]: B = np.ones((4,6))
In [15]: (A + B[:, np.newaxis, :]).shape # B[:, None, :]
Out[15]: (3, 4, 5, 6)
在上面的例子中,我们在 的第一轴和第二轴之间插入了一个临时轴B
(以使用广播)。这里使用 填充了一个缺失的轴,np.newaxis
以使广播操作正常工作。
一般提示:您也可以使用None
代替np.newaxis
;事实上,这些是相同的对象。
In [13]: np.newaxis is None
Out[13]: True
PS 另请参见这个很好的答案:newaxis vs reshape to add Dimensions
解决方案 2:
什么是np.newaxis
?
只是np.newaxis
Python 常量的别名None
,这意味着无论在哪里使用,np.newaxis
您也可以使用None
:
>>> np.newaxis is None
True
如果您阅读使用而不是 的代码,它会更具描述性。np.newaxis
`None`
如何使用np.newaxis
?
通常与切片一起使用。它np.newaxis
表示您要向数组添加额外的维度。的位置np.newaxis
表示我想要添加维度的位置。
>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a.shape
(10,)
在第一个例子中,我使用了第一维的所有元素并添加了第二维:
>>> a[:, np.newaxis]
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
>>> a[:, np.newaxis].shape
(10, 1)
第二个示例添加一个维度作为第一维,然后使用原始数组第一维中的所有元素作为结果数组第二维中的元素:
>>> a[np.newaxis, :] # The output has 2 [] pairs!
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
>>> a[np.newaxis, :].shape
(1, 10)
类似地,您可以使用多个np.newaxis
来添加多个维度:
>>> a[np.newaxis, :, np.newaxis] # note the 3 [] pairs in the output
array([[[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]]])
>>> a[np.newaxis, :, np.newaxis].shape
(1, 10, 1)
还有其他选择吗np.newaxis
?
NumPy 中还有另一个非常相似的功能:np.expand_dims
,它也可以用来插入一个维度:
>>> np.expand_dims(a, 1) # like a[:, np.newaxis]
>>> np.expand_dims(a, 0) # like a[np.newaxis, :]
但鉴于它只是在数组1
中插入 s,shape
您也可以reshape
添加这些维度:
>>> a.reshape(a.shape + (1,)) # like a[:, np.newaxis]
>>> a.reshape((1,) + a.shape) # like a[np.newaxis, :]
大多数时候,np.newaxis
这是添加尺寸的最简单的方法,但了解其他方法也会更好。
何时使用np.newaxis
?
在以下几种情况下添加维度很有用:
如果数据应具有指定数量的维数。例如,如果您想用来
matplotlib.pyplot.imshow
显示一维数组。如果您希望 NumPy 广播数组。通过添加维度,您可以例如获取一个数组的所有元素之间的差异:
a - a[:, np.newaxis]
。这是因为 NumPy 操作从最后一个维度1开始广播。添加必要的维度,以便 NumPy可以广播数组。这是可行的,因为每个长度为 1 的维度都只是广播到另一个数组的相应1维度的长度。
1如果您想了解有关广播规则的更多信息,有关该主题的 NumPy 文档非常好。它还包括一个示例np.newaxis
:
>>> a = np.array([0.0, 10.0, 20.0, 30.0]) >>> b = np.array([1.0, 2.0, 3.0]) >>> a[:, np.newaxis] + b array([[ 1., 2., 3.], [ 11., 12., 13.], [ 21., 22., 23.], [ 31., 32., 33.]])
解决方案 3:
你从一维数字列表开始。使用后numpy.newaxis
,你将其变成二维矩阵,由四行每列组成。
然后,您可以使用该矩阵进行矩阵乘法,或将其参与构建更大的 4 xn 矩阵。
解决方案 4:
newaxis
选择元组中的对象用于将结果选择的维度扩展一个单位长度维度。
它不仅仅是行矩阵到列矩阵的转换。
请考虑以下示例:
In [1]:x1 = np.arange(1,10).reshape(3,3)
print(x1)
Out[1]: array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
现在让我们为数据添加新的维度,
In [2]:x1_new = x1[:,np.newaxis]
print(x1_new)
Out[2]:array([[[1, 2, 3]],
[[4, 5, 6]],
[[7, 8, 9]]])
您可以看到newaxis
这里添加了额外的维度,x1 的维度为 (3,3),X1_new 的维度为 (3,1,3)。
我们的新维度如何使我们能够进行不同的操作:
In [3]:x2 = np.arange(11,20).reshape(3,3)
print(x2)
Out[3]:array([[11, 12, 13],
[14, 15, 16],
[17, 18, 19]])
将 x1_new 和 x2 相加,我们得到:
In [4]:x1_new+x2
Out[4]:array([[[12, 14, 16],
[15, 17, 19],
[18, 20, 22]],
[[15, 17, 19],
[18, 20, 22],
[21, 23, 25]],
[[18, 20, 22],
[21, 23, 25],
[24, 26, 28]]])
因此,newaxis
这不仅仅是将行矩阵转换为列矩阵。它增加了矩阵的维度,从而使我们能够对其进行更多操作。
解决方案 5:
它会扩大其所在位置的暗淡程度。
例如:arr[newaxis]
等于expand_dims(arr, 0)
。
arr[:, newaxis]
等于expand_dims(arr, 1)
arr[:, :, newaxis]
等于expand_dims(arr, 2)