Numpy:如何通过列向量选择二维数组中的行条目

标签 numpy indexing

如何从给定指示符列向量的二维数组中检索列向量?

假设我有

X = np.array([[1, 4, 6],
              [8, 2, 9],
              [0, 3, 7],
              [6, 5, 1]])

S = np.array([0, 2, 1, 2])

是否有一种优雅的方式从 XS 获取结果 array([1, 9, 3, 1]),这相当于

np.array([x[s] for x, s in zip(X, S)])

最佳答案

您可以使用 np.take_along_axis 来实现此目的:

>>> np.take_along_axis(X, S[..., None], axis=1)
array([[1],
       [9],
       [3],
       [1]])

您需要确保两个数组参数具有相同的形状(或者可以应用广播),因此需要 S[..., None] 广播。

当然,您可以使用 [:, 0] 切片 reshape 返回值。

>>> np.take_along_axis(X, S[..., None], axis=1)[:, 0]
array([1, 9, 3, 1])

或者,您可以仅使用带有排列的索引:

>>> X[np.arange(len(S)), S[np.arange(len(S))]]
array([1, 9, 3, 1])

我相信这也相当于 np.diag(X[:, S]) 但有不必要的复制...

关于Numpy:如何通过列向量选择二维数组中的行条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68802886/

相关文章:

python - 按第一行对 numpy 2d 数组进行排序,维护列

python - 类型错误 : 'DataFrame' object is not callable

python - 高效且经济地运行 python 程序的多个实例?

需要 MySQL 查询优化提示

php - 在 While 循环中构建索引 PHP 数组

python - 数字编程语言是否区分 "largest finite number"和 "infinity"?

python - 根据 numpy 数组中设置的条件创建一个新的 numpy 数组

postgresql - 更改唯一索引以在 postgresql 中将其设置为可延迟

mysql - 有没有比为每个排列创建索引更好的索引多列的方法?

MySQL 5.1 到 5.5 升级导致写入速度显着下降(MyISAM + 索引)