2024-10-19 16:22:11 发布
网友
假设我有一个矩阵a具有任意值:
array([[ 2, 4, 5, 3], [ 1, 6, 8, 9], [ 8, 7, 0, 2]])
矩阵B包含a中元素的指数:
如何从A中选择由B指向的值,即:
A[B] = [[2, 2, 4, 5], [1, 9, 8, 6], [2, 0, 7, 8]]
以下是使用for循环的解决方案:
for
outlist = [] for i in range(len(B)): lst = [] for j in range(len(B[i])): lst.append(A[i][B[i][j]]) outlist.append(lst) outarray = np.asarray(outlist) print(outarray)
以上也可以用更简洁的列表理解形式来写:
输出:
[[2 2 4 5] [1 9 8 6] [2 0 7 8]]
最近的版本添加了一个take_along_axis函数来完成此任务:
take_along_axis
In [203]: A = np.array([[ 2, 4, 5, 3], ...: [ 1, 6, 8, 9], ...: [ 8, 7, 0, 2]]) In [204]: B = np.array([[0, 0, 1, 2], ...: [0, 3, 2, 1], ...: [3, 2, 1, 0]]) In [205]: np.take_along_axis(A,B,1) Out[205]: array([[2, 2, 4, 5], [1, 9, 8, 6], [2, 0, 7, 8]])
还有一个put_along_axis。在
put_along_axis
您可以使用^{}-
A[np.arange(A.shape[0])[:,None],B]
也可以使用linear indexing-
linear indexing
样本运行-
In [40]: A Out[40]: array([[2, 4, 5, 3], [1, 6, 8, 9], [8, 7, 0, 2]]) In [41]: B Out[41]: array([[0, 0, 1, 2], [0, 3, 2, 1], [3, 2, 1, 0]]) In [42]: A[np.arange(A.shape[0])[:,None],B] Out[42]: array([[2, 2, 4, 5], [1, 9, 8, 6], [2, 0, 7, 8]]) In [43]: m,n = A.shape In [44]: np.take(A,B + n*np.arange(m)[:,None]) Out[44]: array([[2, 2, 4, 5], [1, 9, 8, 6], [2, 0, 7, 8]])
以下是使用
for
循环的解决方案:以上也可以用更简洁的列表理解形式来写:
^{2}$输出:
最近的版本添加了一个
take_along_axis
函数来完成此任务:还有一个
put_along_axis
。在您可以使用^{} -
也可以使用
^{2}$linear indexing
-样本运行-
相关问题 更多 >
编程相关推荐