【问题标题】:How to access numpy ndarray of arbitrary rank whose shape is reduced in all dimensions如何访问形状在所有维度上都减小的任意等级的numpy ndarray
【发布时间】:2013-03-14 01:11:19
【问题描述】:

我想通过将每个维度中其形状的上限减一来减小任意等级的 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...?这可能会有所帮助。

【问题讨论】:

    标签: python numpy


    【解决方案1】:
    def truncator(array):
      new_shape = [d-1 for d in array.shape]
      return np.resize(array, new_shape)
    

    希望这行得通。

    编辑:你没有指定如何截断数组:如果你只想要一堆:-1s,比如a[:-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
    

    【讨论】:

    • 谢谢,但没有。调整大小操作将数组中的值打乱,与我认为的原始内存布局相匹配。我尝试了一个测试用例,但失败了。
    • 太棒了。谢谢!我会澄清这个问题。你能解释一下代码在做什么吗?
    • 答案也是在原始数组上创建视图,而不是副本。这很好,我只是指出来。
    • 它不应该创建数组的副本,因为我们只是对它进行切片。 :D
    • 多维索引作为元组传递给 numpy 对象。 Numpy 通常会像这里一样自行解决问题,但最好保留使用列表或数组进行索引以进行花哨的索引。保持基本思想,您可以在一行中获得 OP 所需的行为 arr[(slice(-1),) * arr.ndim]
    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2016-10-26
    • 2018-05-13
    相关资源
    最近更新 更多