首页 > 解决方案 > 为什么是 arr[:][np.newaxis].shape = (1, n) 而不是 (n, 1)?

问题描述

np.newaxis(或无)的标准用法在索引括号内。例如

arr = np.arange(4)
print(arr[:,None].shape)
print(arr[None,:].shape)

(4,1)
(1,4)

但我最近看到有人用它作为单独括号中的索引,就像这样

arr = np.arange(4)
print(arr[:][None].shape)
print(arr[None][:].shape)

这使

(1,4)
(1,4)

令我惊讶的是,即使 newaxis 在第一种情况下位于第二个索引位置,这两个结果也是相同的。为什么 arr[:][None].shape 不是 (4,1)?

标签: pythonnumpy

解决方案


Inarr[:][np.newaxis]arr[np.newaxis][:]索引是按顺序完成的,所以arr2 = arr[:][np.newaxis]相当于:

arr_temp = arr[:]
arr2 = arr_temp[np.newaxis]
del arr_temp

同样的逻辑也适用于反过来对索引运算符进行排序,对于arr2 = arr[np.newaxis][:]

arr_temp = arr[np.newaxis]
arr2 = arr_temp[:]
del arr_temp

现在,引用https://numpy.org/doc/1.19/reference/arrays.indexing.html

选择元组中的每个 newaxis 对象都用于将结果选择的维度扩展一个单位长度维度。添加的维度是新轴对象在选择元组中的位置。

由于和np.newaxis都位于索引选择元组中的第一个位置(只有一个位置),因此它将创建新维度作为第一个维度,因此在这两种情况下都会产生结果形状。arr[np.newaxis]arr_temp[np.newaxis](1, 4)


推荐阅读