在numpy数组中得到第k个维度的第i个切片

时间:2017-03-15 18:08:55

标签: python arrays numpy

我有一个n - 维度numpy数组,我想获得i - 维度的第k个切片。必须有比

更好的东西
# ... 
elif k == 5:
    b = a[:, :, :, :, :, i, ...]
# ...

5 个答案:

答案 0 :(得分:11)

b = a[(slice(None),) * k + (i,)]

手动构建索引元组。

Python language reference中所述,表格形式为

a[:, :, :, :, :, i]

转换为

a[(slice(None), slice(None), slice(None), slice(None), slice(None), i)]

我们可以通过直接构建该元组而不是使用切片表示法来实现相同的效果。 (对于a[(i,)],构建元组直接产生a[i]而不是k=0的重要警告,但NumPy为标量i处理这些相同的事情。)< / p>

答案 1 :(得分:3)

我不确定它是否适用于k dim,但它确实适用于2 dim

a.take(i,axis=k)

答案 2 :(得分:2)

基本上,您希望能够以编程方式创建元组:, :, :, :, :, i, ...,以便将其作为a的索引传递。不幸的是,你不能简单地直接在冒号运算符上使用普通元组乘法(即,(:,) * k将无法生成k冒号运算符的元组。但是,您可以使用colon = slice(None)获取“冒号切片”的实例。然后,您可以执行b = a[(colon,) * k + (i,)],这将有效地在a维度的i列上对k进行索引。

在一个函数中包含它,你会得到:

def nDimSlice(a, k, i):
    colon = slice(None)
    return a[(colon,) * k + (i,)]

答案 3 :(得分:1)

这是一个后期条目,可以处理负轴参数,而不必事先知道其操作数的形状:

def put_at(inds, axis=-1, slc=(slice(None),)):
    return (axis<0)*(Ellipsis,) + axis*slc + (inds,) + (-1-axis)*slc

用作

a[put_at(ind_list,axis=axis)]

ind_list可以是您的案例中的标量或更有趣的内容。

复制自我的this评论。

答案 4 :(得分:0)

我不确定这种方法是否会创建数组*的整个副本,但我会采用转置矩阵的一部分来获得第k轴:

import numpy as np

def get_slice(arr, k, i):
    if k >= arr.ndim: #we need at least k dimensions (0 indexed)
        raise ValueError("arr is of lower dimension than {}".format(k))

    axes_reorder = list(range(arr.ndim)) #order of axes for transpose
    axes_reorder.remove(k) #remove original position of k
    axes_reorder.insert(0,k) #insert k at beginning of order

    return arr.transpose(axes_reorder)[i] #k is first axis now

在尝试切片之前,还可以更方便地检查尺寸数量。

*根据docs,尽可能创建内存视图。