类似于numpy.take的函数,它为out参数编制索引

时间:2018-06-14 08:16:23

标签: python numpy numpy-indexing

numpy.take的{​​{3}}中,声明a根据indicesaxis编入索引,然后结果可选地存储在outout参数。是否存在执行out[:, :, indices, :] = a 索引的函数?使用花哨的索引,它将类似于:

axis=2

这里我假设new_data = [[a, [i[-1] for i in b]] for a, b in itertools.groupby(sorted(yyyy_new, key=lambda x:x[0]), key=lambda x:x[0]$ for i in new_data: isplit = i[1] print(i[0],isplit[0],isplit[1]) 但在我的情况下,我事先并不知道轴。 使用1d布尔掩码而不是索引的解决方案也是可以接受的。

2 个答案:

答案 0 :(得分:1)

你可以像这样使用swapax:

>>> A = np.arange(24).reshape(2,3,4)
>>> out = np.empty_like(A)
>>> I = [2,0,1]
>>> axis = 1
>>> out.swapaxes(0, axis)[I] = A.swapaxes(0, axis)
>>> out                                                                                                             
array([[[ 4,  5,  6,  7],                                                                                           
        [ 8,  9, 10, 11],                                                                                           
        [ 0,  1,  2,  3]],                                                                                          

       [[16, 17, 18, 19],                                                                                           
        [20, 21, 22, 23],                                                                                           
        [12, 13, 14, 15]]])                                                                                         

答案 1 :(得分:0)

某些numpy函数在指定轴上运行时构造索引元组。

代码不是特别漂亮,但是一般而且效率相当。

In [700]: out = np.zeros((2,1,4,5),int)
In [701]: out
Out[701]: 
array([[[[0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0]]],


       [[[0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0]]]])

In [702]: indices = [3,0,1]

制作索引元组。从列表或数组开始以便于构造,然后在编制索引时转换为tuple

In [703]: idx = [slice(None)]*out.ndim
In [704]: idx[2] = indices
In [705]: idx
Out[705]: 
[slice(None, None, None),
 slice(None, None, None),
 [3, 0, 1],
 slice(None, None, None)]
In [706]: out[tuple(idx)] = 10    
In [707]: out
Out[707]: 
array([[[[10, 10, 10, 10, 10],
         [10, 10, 10, 10, 10],
         [ 0,  0,  0,  0,  0],
         [10, 10, 10, 10, 10]]],


       [[[10, 10, 10, 10, 10],
         [10, 10, 10, 10, 10],
         [ 0,  0,  0,  0,  0],
         [10, 10, 10, 10, 10]]]])

它匹配take

In [708]: np.take(out, indices, axis=2)
Out[708]: 
array([[[[10, 10, 10, 10, 10],
         [10, 10, 10, 10, 10],
         [10, 10, 10, 10, 10]]],


       [[[10, 10, 10, 10, 10],
         [10, 10, 10, 10, 10],
         [10, 10, 10, 10, 10]]]])

我们可以设置更复杂的值,只要我们获得正确的广播:

out[tuple(idx)] = np.array([10,11,12])[...,None]

我还看到numpy函数将感兴趣的轴移动到已知位置 - 开始或结束。根据行动,可能需要换回。

placeputcopyto等功能提供了控制分配的其他方法(除了通常的索引)。但是没有人使用axis这样的np.take参数。