【问题标题】:Arbitary 1D slices (elements along an axis) across an ndarray - NumPyndarray 上的任意 1D 切片(沿轴的元素) - NumPy
【发布时间】:2019-10-29 23:32:12
【问题描述】:

我发现有几个问题与我要问的问题很接近,但它们的不同之处足以使它们似乎无法解决我的问题。我正在尝试沿一个轴抓取一个 1d 切片以获取 ndarray。以 3d 数组为例

[[[ 0, 1, 2],
  [ 3, 4, 5],
  [ 6, 7, 8]],
 [[ 9,10,11],
  [12,13,14],
  [15,16,17]],
 [[18,19,20],
  [21,22,23],
  [24,25,26]]]

我想要以下一维切片

[0,1,2]
...
[24,25,26]

[0,3,6]
...
[20,23,26]

[0,9,18]
...
[8,17,26]

这实际上等同于以下(对于 3d 数组):

ary[i,j,:]
ary[i,:,k]
ary[:,j,k]

我希望将其推广到 n 维数组

(对于二维数组,我们会得到 ary[i,:] 和 ary[:,j] 等)

是否有一个 numpy 函数可以让我这样做?

编辑:更正了二维索引

【问题讨论】:

  • 第二个应该是9组3个,还是3个9个?
  • 是的,你是对的,那是我的错误。

标签: python numpy indexing numpy-ndarray


【解决方案1】:

我们可以通过选择每一个轴来排列轴,一次一个,在最后推动它并重塑。我们将利用ndarray.ndim 泛化到通用的n-dim ndarrays。此外,np.transpose 可用于置换轴,np.roll 可用于获得滚动轴顺序。实现将非常简单,如下所列 -

# a is input ndarray
R = np.arange(a.ndim)
out = [np.transpose(a,np.roll(R,i)).reshape(-1,a.shape[i]) for i in R]

示例运行 -

In [403]: a = np.arange(27).reshape(3,3,3)

In [325]: R = np.arange(a.ndim)

In [326]: out = [np.transpose(a,np.roll(R,i)).reshape(-1,a.shape[i]) for i in R]

In [327]: out[0]
Out[327]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       ...
       [24, 25, 26]])

In [328]: out[1]
Out[328]: 
array([[ 0,  3,  6],
       [ 9, 12, 15],
       ....
       [20, 23, 26]])

In [329]: out[2]
Out[329]: 
array([[ 0,  9, 18],
       [ 1, 10, 19],
       ....
       [ 8, 17, 26]])

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 2022-10-30
    • 2015-07-13
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多