类似于 numpy.take 的函数,用于索引 out 参数
a function similar to numpy.take that indexes the out parameter
在numpy.take
的documentation中,声明a
是根据indices
和axis
进行索引的,然后选择存储结果在 out
参数中。是否存在对 out
执行索引的函数?使用花式索引它会是这样的:
out[:, :, indices, :] = a
这里我假设 axis=2
但在我的情况下我事先不知道轴。
使用 1d 布尔掩码而不是索引的解决方案也是可以接受的。
您可以像这样使用交换轴:
>>> 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
将感兴趣的轴移动到已知位置的函数 - 起点或终点。根据操作,它可能需要换回。
place
、put
、copyto
等函数提供了其他控制赋值的方法(除了通常的索引之外)。但是 none 采用 axis
参数,例如 np.take
.
在numpy.take
的documentation中,声明a
是根据indices
和axis
进行索引的,然后选择存储结果在 out
参数中。是否存在对 out
执行索引的函数?使用花式索引它会是这样的:
out[:, :, indices, :] = a
这里我假设 axis=2
但在我的情况下我事先不知道轴。
使用 1d 布尔掩码而不是索引的解决方案也是可以接受的。
您可以像这样使用交换轴:
>>> 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
将感兴趣的轴移动到已知位置的函数 - 起点或终点。根据操作,它可能需要换回。
place
、put
、copyto
等函数提供了其他控制赋值的方法(除了通常的索引之外)。但是 none 采用 axis
参数,例如 np.take
.