首页 > 解决方案 > 对于 NumPy 中的多维情况,np.take 是否存在相反的情况?

问题描述

如果我有N-D 数组a和 1-D 数组indexesand ,将值分配给沿给定轴的这些索引索引axis的子数组的最短/最简单方法是什么?a

如果N并且axis在代码编写时已知/已修复,那么我可以轻松做到

a[:,   :,   :,   indexes,   :,   :] = b
               ^^axis pos^^

但是如果N并且axis仅在运行时知道,例如在用户输入一些数据之后,该怎么办。

我想出的最简单的形式是这样的:

a[(slice(None),) * (axis % a.ndim) + (indexes,)] = b

但也许有一些内置功能?

np.put但它似乎只适用于扁平数组,不支持多维。

还有np.take,它适用于多维情况,但与我需要的相反,它读取数据而不是写入,尽管它具有我正在寻找的确切语法。你可以这样做:

b = np.take(a, indexes, axis)

那么有相反的np.take吗?就像np.nd_put,可以这样做:

np.nd_put(a, indexes, axis, b)

标签: pythonarraysnumpymultidimensional-array

解决方案


一种方法是置换轴以将其axis放在前面并简单地索引 -

np.moveaxis(a,axis,0)[indexes] = np.moveaxis(b,axis,0)

np.put_along_axis如果您正在寻找围绕 bultin 构建的东西-

i = [None]*b.ndim
i[axis] = Ellipsis
np.put_along_axis(a, indexes[tuple(i)], b, axis=axis)

为了完整起见,这里是切片版本 -

i = [slice(None)]*b.ndim
i[axis] = indexes
a[tuple(i)] = b

您可以转换为单行以i进行列表理解。


推荐阅读