python - 为什么是 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)?
解决方案
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)
推荐阅读
- python - 如何在 Django 中通过 id 搜索查询集而无需额外的 db 调用
- android - 如何在视图下方滚动 RecyclerView 而无需单击该 RecyclerView 的项目
- javascript - 刷新页面时未定义反应挂钩上下文状态
- java - 如果堆栈为空,则覆盖 stack.peek() 以返回 null
- vb.net - 删除 Datagridview 中的选定行
- sql - SQL 查询和表连接
- ios - SwiftUI 切换不改变值
- reactjs - 将图像标签添加到 SVG 反应组件
- android - 按钮单击以更改片段中的视图 - Kotlin
- android - 依赖 com.android.tools.build:gradle:3.6.4 因为没有定义存储库