2

我有两个索引数组,我想手动返回中间的所有索引,就像一个切片函数,它看起来像这样:

ind1 = np.array([2,6])
ind2 = np.array([2,3])

final = np.array([[2,2,2], [4,5,6]])

由于切片的轴不固定,我想出了这个:

def index_slice(ind1,ind2):
    return np.indices( 1 + ind1 - ind2 ) + ind2[:,np.newaxis,np.newaxis]

final = index_slice(ind1,ind2)

但是,这依赖于1 + ind1 > ind2 并且它也包括最后一个索引(不是pythonic)。有人会知道执行此操作的功能或更清洁的实现吗?
先感谢您。迭戈

PS 给出这个想法从何而来的一些背景。我正在考虑矩阵的子矩阵,我想从两个角落的索引中访问它们。由于问题的性质,给定的角并不总是与您在@pelson 的答案中看到的方向相同。

4

1 回答 1

0

我没有它在一个班轮中,但类似以下的内容将重现您似乎要求的结果:

def index_slice(arr1, arr2):
    lens = np.abs(arr1 - arr2)
    if not all((lens == max(lens)) | (lens == 0)):
        raise ValueError('The number of indices in some dimensions were inconsistent. Array lengths were %r' % lens)

    max_len = lens.max()
    result = np.empty((len(lens), max_len), dtype=np.int32)

    for dim, (a, b) in enumerate(zip(arr1, arr2)):
        if a == b:
            result[dim, :] = a
        elif a > b:
            result[dim, :] = np.arange(a, b, -1)
        else:
            result[dim, :] = np.arange(a, b)

    return result   

例如:

>>> ind1 = np.array([2, 6])
>>> ind2 = np.array([2, 3])
>>> print index_slice(ind1, ind2)
[[2 2 2]
 [6 5 4]]


>>> ind1 = np.array([2, 6, 1])
>>> ind2 = np.array([2, 3, 4])
>>> print index_slice(ind1, ind2)
[[2 2 2]
 [6 5 4]
 [1 2 3]]

但是,提出这个问题会引起我的怀疑,即如果您要共享上游逻辑,您可能正在做一些可以以更简单的方式完成的事情。

高温高压

于 2012-07-30T21:55:32.243 回答