如何访问任意级别的numpy ndarray,其形状在所有维度上都减少了

时间:2013-03-14 01:11:19

标签: python numpy

我希望通过将每个维度的形状上限减一来减小任意等级的numpy ndarray的大小。数组值应相对于其原始索引移动。

所以,

    [N] becomes [N-1]
  [N,M] becomes [N-1, M-1]
[N,M,P] becomes [N-1, M-1, P-1], etc.

这应该由一个事先不知道数组排名的函数来处理。

import numpy as np

def truncator( array ):
   # flailing
   return truncated_array


>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> truncator(a)
array([[0, 1],
       [3, 4]])

我已经考虑过reshaperesize但没有成功。提前了解数组排名我知道如何使用像truncated_array = array[:-1,:-1]这样的视图,但我不知道如何使该概念适用于任意排名。是否有类似Elipses...的固定宽度?这可能有所帮助。

1 个答案:

答案 0 :(得分:0)

def truncator(array):
  new_shape = [d-1 for d in array.shape]
  return np.resize(array, new_shape)
希望这有效。

编辑:您没有指定数据应该如何被截断:如果您只想要一堆:-1a[:-1,:-1:,-1]

def another_truncator(array):
  slicers = [slice(-1) for d in array.shape]
  return array[slicers]


>>> a
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4]])
>>> another_truncator(a)
array([[0, 1],
       [1, 2]])

它的作用:

您可以按col[start:end:step]'切片'集合。实际上[::]中使用的切片运算符(col[start:end:step])可以表示为slice对象(slice(start, end, step)),您可以使用该对象“切片”集合用整数索引做。

截断一个(可能是嵌套的)数组,你必须选择除最后一个项目之外的所有项目 - [:-1] - 因此slice(-1),你必须选择n次,n是数组的维度。

def another_truncator(array):
  slicers = [slice(-1) for d in array.shape] #create n slicers
  return array[slicers] #slice and return