Python Numpy矩阵:根据列表选择列
我有一个numpy数组和一个列表,该列表定义了我要选择的行。 进行此操作的最佳方法是什么Python Numpy矩阵:根据列表选择列,python,arrays,numpy,Python,Arrays,Numpy,我有一个numpy数组和一个列表,该列表定义了我要选择的行。 进行此操作的最佳方法是什么 import numpy as np a = np.array([[1,2,3], [4,5,6], [7,8,9]]) b = np.array([[1], [0], [2]]) 期望结果 np.array([[2], [4], [9]]) 我尝试过n
import numpy as np
a = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
b = np.array([[1],
[0],
[2]])
期望结果
np.array([[2],
[4],
[9]])
我尝试过np.take(),但这不起作用
问候
编辑:由于这需要在大型阵列上重复执行,因此我正在寻找一种矢量化方法(无循环)这不是很像python,但这应该可以解决您的问题:
res = np.zeros(len(b))
for i, row in enumerate(a):
res[i] = row[b[i]]
print(res)
同一行:
a[[i[0] for i in b],[i for i in range(len(b))]]
这不是很像蟒蛇,但这应该可以解决你的问题:
res = np.zeros(len(b))
for i, row in enumerate(a):
res[i] = row[b[i]]
print(res)
同一行:
a[[i[0] for i in b],[i for i in range(len(b))]]
您可以使用列表:
np.array([a[i,b[i]] for i in range(len(b))]
您可以使用列表:
np.array([a[i,b[i]] for i in range(len(b))]
如果从
b
b = np.sqeeze(b)
您可以使用以下选项:
a[np.arange(len(b)), b]
如果从
b
b = np.sqeeze(b)
您可以使用以下选项:
a[np.arange(len(b)), b]
最新版本添加了一个沿轴移动的
,
,它可以满足您的需要:
In [96]: a = np.array([[1,2,3],
...: [4,5,6],
...: [7,8,9]])
...:
...: b = np.array([[1],
...: [0],
...: [2]])
In [97]: np.take_along_axis(a,b,axis=1)
Out[97]:
array([[2],
[4],
[9]])
它的工作原理很像,a[np.arange(3),np.squence(b)]
,但处理维度的效果更好
最近的类似问题:
最新版本添加了一个
沿轴取下的,它可以满足您的需要:
In [96]: a = np.array([[1,2,3],
...: [4,5,6],
...: [7,8,9]])
...:
...: b = np.array([[1],
...: [0],
...: [2]])
In [97]: np.take_along_axis(a,b,axis=1)
Out[97]:
array([[2],
[4],
[9]])
它的工作原理很像,a[np.arange(3),np.squence(b)]
,但处理维度的效果更好
最近的类似问题:
实现这一点的数学逻辑是什么?对于a
中的每一行,您选择b
定义的列中的元素,因此您需要a
中第一行的第一个元素、第二行的第0个元素和最后一行的第二个元素(定义见b
),这是否回答了您的问题?实现这一点的数学逻辑是什么?对于a
中的每一行,您选择b
定义的列中的元素,因此您需要a
第一行的第一个元素、第二行的第0个元素和最后一行的第二个元素(如b
中定义的),这是否回答了您的问题?谢谢,这确实是我们想要的行动!有没有一种没有循环的方法呢?谢谢,这确实是我们想要的动作!有没有办法不使用循环?看一看新的np。沿着轴看一看新的np。沿着轴看这确实是我需要的。谢谢这确实是我所需要的。谢谢