python - 在numpy中按索引选择
问题描述
假设两个数组
ind =
array([[1, 3, 2, 4, 0],
[0, 1, 3, 2, 4],
[3, 4, 2, 0, 1]])
x =
array([[[24, 97, 28, 57, 59],
[97, 67, 94, 77, 50],
[56, 89, 25, 55, 76],
[88, 21, 1, 50, 24]],
[[54, 83, 64, 81, 12],
[89, 49, 15, 26, 97],
[94, 97, 32, 55, 79],
[24, 63, 63, 15, 40]],
[[41, 99, 84, 64, 21],
[12, 9, 85, 43, 28],
[75, 98, 48, 10, 0],
[93, 94, 37, 22, 63]]])
我想根据第一个数组重新排序第二个数组。(第一个数组是索引)
所以,也许结果会像下面这样。
array([[[97, 57, 28, 59, 24],
[67, 77, 94, 50, 97],
[89, 55, 25, 76, 56],
[21, 50, 1, 24, 88]],
[[54, 83, 81, 64, 12],
[89, 49, 26, 15, 97],
[94, 97, 55, 32, 79],
[24, 63, 15, 63, 40]],
[[64, 21, 84, 41, 99],
[43, 28, 85, 12, 9],
[10, 0, 48, 75, 98],
[22, 63, 37, 93, 94]]])
# x[0]s are reordered by ind[0] and so on.
这可能与np.take吗?
解决方案
它很容易使用take_along_axis
:
>>> np.take_along_axis(x, ind[:, None, :], 2)
array([[[97, 57, 28, 59, 24],
[67, 77, 94, 50, 97],
[89, 55, 25, 76, 56],
[21, 50, 1, 24, 88]],
[[54, 83, 81, 64, 12],
[89, 49, 26, 15, 97],
[94, 97, 55, 32, 79],
[24, 63, 15, 63, 40]],
[[64, 21, 84, 41, 99],
[43, 28, 85, 12, 9],
[10, 0, 48, 75, 98],
[22, 63, 37, 93, 94]]])
如果您使用的是 1.15 之前的 numpy,您可以执行以下操作:
>>> m,n,k = x.shape
>>> m,n,k = np.ogrid[:m, :n, :k]
>>> x[m,n,ind[:, None, :]]
array([[[97, 57, 28, 59, 24],
[67, 77, 94, 50, 97],
[89, 55, 25, 76, 56],
[21, 50, 1, 24, 88]],
[[54, 83, 81, 64, 12],
[89, 49, 26, 15, 97],
[94, 97, 55, 32, 79],
[24, 63, 15, 63, 40]],
[[64, 21, 84, 41, 99],
[43, 28, 85, 12, 9],
[10, 0, 48, 75, 98],
[22, 63, 37, 93, 94]]])
推荐阅读
- java - Java - 为什么从文件读取时跳过零
- ios - 无法分配给属性:“自我”是不可变的快速错误
- c# - 如何绕过 C# 中的函数参数?
- android - 单击 recyclerview 适配器中的第一项时,最后一项被删除
- java - 两台计算机的 Java unknownhostException
- c++ - 反转数组中的正序列
- visual-studio - Visual Studio 2017 和 Arduino
- angular - 使用 Angular 动画滑入和滑出组件
- java - 如何在 MyBatis 中将整数转换为枚举?
- recursion - 此函数中的 LEA 指令的目的是什么?整体递归的作用是什么?