我有两个索引数组,我希望在它们之间返回所有索引,比如切片函数,手动它看起来像这样:
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)。有谁知道这样做的功能,或更清洁的实现?
先感谢您。
迭戈
P.S。给出这个想法来自何处的背景。我正在考虑矩阵的子矩阵,我想从两个角落的索引中访问它们。由于问题的性质,给定的角落并不总是与@ pelson的答案中所见的方向相同。
答案 0 :(得分: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]]
然而,提出这个问题让我怀疑你可能正在做一些事情,如果你要分享你的上游逻辑,可以用更简单的方式完成。
HTH