在numpy中用一个数组索引另一个数组
- 2024-12-30 08:41:00
- admin 原创
- 40
问题描述:
假设我有一个包含一些任意值的矩阵A :
array([[ 2, 4, 5, 3],
[ 1, 6, 8, 9],
[ 8, 7, 0, 2]])
矩阵B包含 A 中元素的索引:
array([[0, 0, 1, 2],
[0, 3, 2, 1],
[3, 2, 1, 0]])
如何从B指向的A中选择值,即:
A[B] = [[2, 2, 4, 5],
[1, 9, 8, 6],
[2, 0, 7, 8]]
解决方案 1:
编辑:np.take_along_axis
是自 1.15 版起为此用例实现的内置函数numpy
。请参阅下面 @hpaulj 的回答以了解如何使用它。
您可以使用NumPy's advanced indexing
-
A[np.arange(A.shape[0])[:,None],B]
也可以使用linear indexing
-
m,n = A.shape
out = np.take(A,B + n*np.arange(m)[:,None])
样本运行 -
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]])
解决方案 2:
较新的版本添加了一个take_along_axis
可以完成此项工作的功能:
A = np.array([[ 2, 4, 5, 3],
[ 1, 6, 8, 9],
[ 8, 7, 0, 2]])
B = np.array([[0, 0, 1, 2],
[0, 3, 2, 1],
[3, 2, 1, 0]])
np.take_along_axis(A, B, 1)
Out[]:
array([[2, 2, 4, 5],
[1, 9, 8, 6],
[2, 0, 7, 8]])
还有一个put_along_axis
。
解决方案 3:
我知道这是一个老问题,但使用索引的另一种方法是:
A[np.indices(B.shape)[0], B]
输出:
[[2 2 4 5]
[1 9 8 6]
[2 0 7 8]]
解决方案 4:
以下是使用循环的解决方案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)
以上内容也可以用更简洁的列表推导形式来写:
outlist = [ [A[i][B[i][j]] for j in range(len(B[i]))]
for i in range(len(B)) ]
outarray = np.asarray(outlist)
print(outarray)
输出:
[[2 2 4 5]
[1 9 8 6]
[2 0 7 8]]
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD