一个类似于 numpy.take 的函数,用于索引 out 参数



numpy.take的文档中,声明a根据indicesaxis进行索引,然后结果可以选择存储在out参数中。是否存在对out执行索引的函数?使用花哨的索引,它将是这样的:

out[:, :, indices, :] = a

在这里,我假设axis=2但就我而言,我事先不知道轴。 使用一维布尔掩码而不是索引的解决方案也是可以接受的。

你可以像这样使用交换轴:

>>> 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]]])                                                                                         

某些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这样的函数,它们提供了其他控制分配的方法(除了通常的索引(。 但是没有人像np.take那样采用axis参数。

相关内容

  • 没有找到相关文章