2012-07-30 83 views
2

我有两个数组索引和我要回所有的指标之间,就像一个切片功能,手动将是这样的:功能切片指数在numpy的

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,它包括最后一个索引,以及(不符合Python)。有谁会知道这样做的功能,还是更清洁的实现?
预先感谢您。 Diego

P.S.给出一些这个想法来自何处的背景。我正在考虑一个矩阵的子矩阵,我想从两个角落的索引中访问它们。由于问题的性质,给定的角落并不总是具有相同的方向,你可以在@Pelson的答案中看到。

+0

因此对于'ind1'和'ind2'的每个成员,你想要一个包含插入索引的'final'中的行吗? 'ind1'和'ind2'是否总是两个值?另外,就像phihag说的那样,如果你接受以前的问题的答案,它会鼓励人们回答你未来的问题。 – 2012-07-30 21:34:50

+0

谢谢你的提示。当我试图添加一些评论时,我并没有意识到要标记正确的答案,所以是的...这样好多了。 – Diego 2012-07-31 02:41:36

+0

当我想到'ind1'和'ind2'时,它们可以是任何ND数组中的两个索引,'final'应该填充它们之间的矩阵......就像在pelson的答案中一样。 – Diego 2012-07-31 02:47:15

回答

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

+0

这正是我正在寻找的。感谢您的反馈。 – Diego 2012-07-31 03:02:05