Indexing a numpy array with a list of tuples

后端 未结 2 661
忘了有多久
忘了有多久 2020-12-02 16:59

Why can\'t I index an ndarray using a list of tuple indices like so?

idx = [(x1, y1), ... (xn, yn)]
X[idx]

Instead I have to do something u

相关标签:
2条回答
  • 2020-12-02 17:43

    You can use a list of tuples, but the convention is different from what you want. numpy expects a list of row indices, followed by a list of column values. You, apparently, want to specify a list of (x,y) pairs.

    http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#integer-array-indexing The relevant section in the documentation is 'integer array indexing'.


    Here's an example, seeking 3 points in a 2d array. (2 points in 2d can be confusing):

    In [223]: idx
    Out[223]: [(0, 1, 1), (2, 3, 0)]
    In [224]: X[idx]
    Out[224]: array([2, 7, 4])
    

    Using your style of xy pairs of indices:

    In [230]: idx1 = [(0,2),(1,3),(1,0)]
    In [231]: [X[i] for i in idx1]
    Out[231]: [2, 7, 4]
    
    In [240]: X[tuple(np.array(idx1).T)]
    Out[240]: array([2, 7, 4])
    

    X[tuple(zip(*idx1))] is another way of doing the conversion. The tuple() is optional in Python2. zip(*...) is a Python idiom that reverses the nesting of a list of lists.

    You are on the right track with:

    In [242]: idx2=np.array(idx1)
    In [243]: X[idx2[:,0], idx2[:,1]]
    Out[243]: array([2, 7, 4])
    

    My tuple() is just a bit more compact (and not necessarily more 'pythonic'). Given the numpy convention, some sort of conversion is necessary.

    (Should we check what works with n-dimensions and m-points?)

    0 讨论(0)
  • 2020-12-02 17:56

    Use tuple of numpy arrays which can be directly passed to matrix to get the elements

    Index = tuple(np.array(list(zip(*index_tuple))))
    new_array = list(prev_array[index])
    
    0 讨论(0)
提交回复
热议问题