Python numpy索引多维数组
对于Python numpy索引多维数组,python,numpy,Python,Numpy,对于y的每一行,我想得到其索引在m中指定的元素 >>> y = np.arange(15).reshape(3,5) [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] >>> m = np.array([[0, 1], [1, 2], [2, 3]]) 预期输出: [[0, 1] [6, 7] [12, 13]] 针对循环的解决方案 >>> np.stack([y[i, c
y
的每一行,我想得到其索引在m
中指定的元素
>>> y = np.arange(15).reshape(3,5)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
>>> m = np.array([[0, 1], [1, 2], [2, 3]])
预期输出:
[[0, 1]
[6, 7]
[12, 13]]
针对循环的解决方案
>>> np.stack([y[i, cols] for i, cols in enumerate(m)])
有没有一种方法可以在没有
for
循环的情况下执行此操作?使用一个数组中的值作为另一个数组的索引被称为“花式索引”,但是索引操作将对所有行重复:
y = numpy.arange(15).reshape(3,5)
y[:, [0, 2, 3]]
# array([[ 0, 2, 3],
# [ 5, 7, 8],
# [10, 12, 13]])
如果要单独“每行使用一个索引值”,则需要将该行与索引的关系作为另一个索引:
y[[0, 1, 2], [0, 2, 3]]
# array([ 0, 7, 13])
由于索引数组m
是二维的,因此需要告诉NumPym
中这两个维度中的哪一个对应于行索引。您可以通过向升序索引添加另一个空轴(关键字:广播)来实现这一点,然后
y = numpy.arange(15).reshape(3,5)
m = numpy.array([[0, 1], [1, 2], [2, 3]])
y[numpy.arange(len(m))[:, None], m]
# array([[ 0, 1],
# [ 6, 7],
# [12, 13]])
有一行,虽然没有比您自己使用for循环的方案好多少:
y[..., m][np.identity(3, dtype=bool)]
虽然它会给你一些关于numpy索引的见解