通过没有循环的二维索引数组索引二维 numpy 数组 [英] Index 2D numpy array by a 2D array of indices without loops

查看:54
本文介绍了通过没有循环的二维索引数组索引二维 numpy 数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一种矢量化方法来通过索引的 numpy.array 索引 numpy.array.

例如:

将 numpy 导入为 npa = np.array([[0,3,4],[5,6,0],[0,1,9]])inds = np.array([[0,1],[1,2],[0,2]])

我想构建一个新数组,使得该数组中的每一行 (i) 都是数组 a 的一行 (i),由数组 inds(i) 的行索引.我想要的输出是:

array([[ 0., 3.], # a[0][:,[0,1]][ 6., 0.], # a[1][:,[1,2]][ 0., 9.]]) # a[2][:,[0,2]]

我可以用一个循环来实现:

def loop_way(my_array, my_indices):new_array = np.empty(my_indices.shape)对于 xrange(len(my_indices)) 中的 i:new_array[i, :] = my_array[i][:, my_indices[i]]返回新数组

但我正在寻找一种纯矢量化的解决方案.

解决方案

当使用索引数组索引另一个数组时,每个索引数组的形状应该与输出数组的形状相匹配.您希望列索引匹配 inds,并且您希望行索引匹配输出的行,例如:

array([[0, 0],[1, 1],[2, 2]])

你可以只使用上面的单列,由于广播,所以你可以使用 np.arange(3)[:,None] 是垂直的 arange 因为 None 插入一个新轴:

<预><代码>>>>np.arange(3)[:, None]数组([[0],[1],[2]])

终于在一起了:

<预><代码>>>>a[np.arange(3)[:,None], inds]数组([[0, 3], # a[0,[0,1]][6, 0], # a[1,[1,2]][0, 9]]) # a[2,[0,2]]

I am looking for a vectorized way to index a numpy.array by numpy.array of indices.

For example:

import numpy as np

a = np.array([[0,3,4],
              [5,6,0],
              [0,1,9]])

inds = np.array([[0,1],
                 [1,2],
                 [0,2]])

I want to build a new array, such that every row(i) in that array is a row(i) of array a, indexed by row of array inds(i). My desired output is:

array([[ 0.,  3.],   # a[0][:,[0,1]]
       [ 6.,  0.],   # a[1][:,[1,2]] 
       [ 0.,  9.]])  # a[2][:,[0,2]]

I can achieve this with a loop:

def loop_way(my_array, my_indices):
    new_array = np.empty(my_indices.shape)
    for i in xrange(len(my_indices)):
        new_array[i, :] = my_array[i][:, my_indices[i]]
    return new_array 

But I am looking for a pure vectorized solution.

解决方案

When using arrays of indices to index another array, the shape of each index array should match the shape of the output array. You want the column indices to match inds, and you want the row indices to match the row of the output, something like:

array([[0, 0],
       [1, 1],
       [2, 2]])

You can just use a single column of the above, due to broadcasting, so you can use np.arange(3)[:,None] is the vertical arange because None inserts a new axis:

>>> np.arange(3)[:, None]
array([[0],
       [1],
       [2]])

Finally, together:

>>> a[np.arange(3)[:,None], inds]
array([[0, 3],   # a[0,[0,1]]
       [6, 0],   # a[1,[1,2]] 
       [0, 9]])  # a[2,[0,2]]

这篇关于通过没有循环的二维索引数组索引二维 numpy 数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆