Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用另一个二维数组索引NumPy二维数组_Python_Numpy_Indexing_Scipy - Fatal编程技术网

Python 使用另一个二维数组索引NumPy二维数组

Python 使用另一个二维数组索引NumPy二维数组,python,numpy,indexing,scipy,Python,Numpy,Indexing,Scipy,我有点像 m = array([[1, 2], [4, 5], [7, 8], [6, 2]]) 及 我的目标是 result = array([1, 5, 7, 6]) 我边读边试,但这并没有得到我想要的结果 p、 如果你能想出一个更精确的问题,请更改这个问题的标题。使用python怎么样 result = array([subarray[index] for subarray, index in zip(m, sel

我有点像

m = array([[1, 2],
            [4, 5],
            [7, 8],
            [6, 2]])

我的目标是

result = array([1, 5, 7, 6])
我边读边试,但这并没有得到我想要的结果


p、 如果你能想出一个更精确的问题,请更改这个问题的标题。

使用python怎么样

result = array([subarray[index] for subarray, index in zip(m, select)])
我更喜欢使用NP.where为这类任务编制索引(而不是NP.ix)

OP中未提及的是结果是按位置(源数组中的行/列)还是按某些条件(例如,m>=5)选择的。无论如何,下面的代码片段涵盖了这两种情况

三个步骤:

  • 创建条件数组

  • 通过调用NP.where,传入此 条件数组;及

  • 对源数组应用此索引数组



  • 传递给NP.where的参数cnd是一个布尔数组,在本例中,它是由复合条件表达式(上面第一行)组成的单个表达式的结果

    如果构建这样一个值过滤器不适用于您的特定用例,那很好,您只需要以其他方式(或直接创建)生成实际的布尔矩阵(cnd的值)。

    实现这一点的基本方法是使用
    np。选择
    或花式索引/获取(见下文):

    因此,不需要python循环或其他任何东西,numpy提供了所有的速度优势
    m.T
    是必需的,因为choose实际上更像是两个数组之间的选择
    np.choose(select,(m[:,0],m[:1])
    ,但这样使用它很简单


    使用花式索引:

    如果速度是非常重要的
    np.take
    ,它可以在1D视图上工作(出于某种原因,速度会快一些,但对于这些微小的阵列可能不会):


    嗯,这是最简单的变体:

    m[np.arange(4), select]
    

    由于标题是指用另一个2D数组索引一个2D数组,因此可以找到实际的通用numpy解决方案

    简言之: 具有任意大尺寸m的形状(n,m)的二维索引数组名为
    inds
    ,用于访问另一个二维形状数组(n,k)(名为
    B
    )的元素:

    # array of index offsets to be added to each row of inds
    offset = np.arange(0, inds.size, inds.shape[1])
    
    # numpy.take(B, C) "flattens" arrays B and C and selects elements from B based on indices in C
    Result = np.take(B, offset[:,np.newaxis]+inds)
    
    另一个解决方案,不使用
    np.take
    ,我发现更直观的是:

    B[np.expand_dims(np.arange(B.shape[0]), -1), inds]
    
    这种语法的优点是,它既可以用于基于
    inds
    (如
    np.take
    )从
    B
    读取元素,也可以用于赋值。

    我建议将“按列表过滤2D数组”作为标题。在撰写本文(np 1.9.2)时,np.choose()可能有最多32个元素的严重限制。如果m的较长维度超过此值,则我会收到“ValueError:需要2到(32)个数组对象(包括)
    m = array([[1, 2],
               [4, 5],
               [7, 8],
               [6, 2]])
    select = array([0,1,0,0])
    
    result = np.choose(select, m.T)
    
    result = m[np.arange(len(select)), select]
    
    result = m.take(select+np.arange(0, len(select) * m.shape[1], m.shape[1]))
    
    m[np.arange(4), select]
    
    # array of index offsets to be added to each row of inds
    offset = np.arange(0, inds.size, inds.shape[1])
    
    # numpy.take(B, C) "flattens" arrays B and C and selects elements from B based on indices in C
    Result = np.take(B, offset[:,np.newaxis]+inds)
    
    B[np.expand_dims(np.arange(B.shape[0]), -1), inds]