python - 对于 NumPy 中的多维情况,np.take 是否存在相反的情况?
问题描述
如果我有N
-D 数组a
和 1-D 数组indexes
and ,将值分配给沿给定轴的这些索引索引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)
解决方案
一种方法是置换轴以将其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
进行列表理解。
推荐阅读
- wordpress - 我可以通过 Wordpress API 获取 Wordpress 插件数据吗?
- kubernetes - 如何更改在一个端口号上运行的服务,现在我想在同一个旧端口号上运行另一项服务
- html - 如何使用我从 css 文件中导入的字体
- python-3.x - 如何使用starts_with jmespath.search 字典键
- python - 如何评估 Jupyter Notebook 中的分数(代入变量值)?
- javascript - Chrome DevTools:如何从 Sources 选项卡或 Watch 窗格中将 JSON 对象复制为文本
- spring-boot - Spring Boot 安全性在响应标头 cookie 中添加 2 个 XSRF-TOKEN
- php - PHP Laravel PDOException 一般错误引用列和外键约束中的引用列不兼容
- python - 这个函数在我的代码中扮演什么角色?
- ios - 多个故事板是让我的图形密集型应用在所有 iPhone 上看起来都不错的唯一方法吗?