Python 使用列表列表进行Numpy索引
我有一个Python 使用列表列表进行Numpy索引,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,我有一个numpy数组的索引列表,但使用它们时并没有得到想要的结果 n=3 a=np.array([[8,1,6], [3, 5, 7], [4, 9, 2]]) np.随机种子(7) idx=np.random.choice(np.arange(n),size=(n,n-1)) #数组([[0,1], # [2, 0], # [1, 2]]) 在这种情况下,我希望: 第0行的元素0和1 第1行的元素2和0 第2行的元素1和2 我的列表有n个子列表,所有这些列表
numpy
数组的索引列表,但使用它们时并没有得到想要的结果
n=3
a=np.array([[8,1,6],
[3, 5, 7],
[4, 9, 2]])
np.随机种子(7)
idx=np.random.choice(np.arange(n),size=(n,n-1))
#数组([[0,1],
# [2, 0],
# [1, 2]])
在这种情况下,我希望:
- 第0行的元素0和1
- 第1行的元素2和0
- 第2行的元素1和2
n个子列表
,所有这些列表的长度都相同。
我希望每个子列表只使用一次,而不是用于所有轴
# Wanted result
# b = array[[8, 1],
# [7, 3],
# [9, 2]])
我可以做到这一点,但这似乎是相当繁琐的大量重复和重塑
# Possibility 1
b = a[:, idx]
# array([[[8, 1], | [[3, 5], | [[4, 9],
# [6, 8], | [7, 3], | [2, 4],
# [1, 6]], | [5, 7]], | [9, 2]])
b = b[np.arange(n), np.arange(n), :]
# Possibility 2
b = a[np.repeat(range(n), n-1), idx.ravel()]
# array([8, 1, 7, 3, 9, 2])
b = b.reshape(n, n-1)
有更简单的方法吗?您可以使用
np。沿轴取下\u
np.take_along_axis(a, idx, 1)
array([[8, 1],
[7, 3],
[9, 2]])
或使用广播
:
a[np.arange(a.shape[0])[:,None], idx]
array([[8, 1],
[7, 3],
[9, 2]])
注意,在这里使用时,需要指定要使用idx
索引的轴和行