我有一个...X n x m数组,比如a,其中...代表任意数量的附加维度.为简单起见,我们称n维为"行",称m维为"列",即使该数组是高维的.

我还有一个长度为n的向量v,它包含最后一个维度的索引(从0到m-1).我想创建一个数组b,它使用这个向量来提取每一行的指示列.

使用循环可以很容易地做到这一点.以下是一个最小的工作示例:

import numpy as np

a = np.round(np.random.rand(2,3,4)*10)
v = [0, 2, 1]

print(a)
"""[[[ 1.  6.  9.  9.]
  [ 1.  8.  4. 10.]
  [ 0.  0.  5.  3.]]

 [[ 7.  8.  1. 10.]
  [ 7.  9.  7.  8.]
  [ 3.  4.  8.  7.]]]
"""

b = []
for i in range(len(v)):
    b.append(a.take(i, axis=-2).take(v[i], axis=-1))
b = np.asarray(b)

print(b)
"""
[[1. 7.]
 [4. 7.]
 [0. 4.]]
"""

有没有更聪明的方法在不循环的情况下进行这种索引?

推荐答案

我想这会奏效的:

a[:, np.arange(len(v)), v].T

通常,您可以使用此语法对所有维度进行索引.在上面的示例中,使用: Select 第一维(深度)中的所有元素,然后使用np.arange(len(v)) Select 第二维(行)中的元素0、1、2,最后使用v Select 最后一维(列)中的元素0、2、1.我将结果与T互换,以获得与b相同的维度.

docs人开始:

基本切片在切片元组中有多个非:条目,其作用类似于使用单个非:条目重复应用切片,其中连续获取非:条目(所有其他非:条目替换为:).因此,在基本切片下,x[ind1,...,ind2,:]的行为类似于x[ind1][...,ind2,:].

Python相关问答推荐

Pythind 11无法弄清楚如何访问tuple元素

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

在Mac上安装ipython

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

对象的`__call__`方法的setattr在Python中不起作用'

优化器的运行顺序影响PyTorch中的预测

在极性中创建条件累积和

ThreadPoolExecutor和单个线程的超时

计算每个IP的平均值

启用/禁用shiny 的自动重新加载

如何在Python中使用另一个数据框更改列值(列表)

Geopandas未返回正确的缓冲区(单位:米)

pandas:在操作pandora之后将pandora列转换为int

获取PANDA GROUP BY转换中的组的名称

我什么时候应该使用帆布和标签?

极柱内丢失类型信息""

在matplotlib中重叠极 map 以创建径向龙卷风图

为什么我的scipy.optimize.minimize(method=";newton-cg";)函数停留在局部最大值上?

在不中断格式的情况下在文件的特定部分插入XML标签

PYODBC错误(SQL包含-26272个参数标记,但提供了235872个参数,HY 000)