Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy矩阵:根据列表选择列_Python_Arrays_Numpy - Fatal编程技术网

Python 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

我有一个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]])
我尝试过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。沿着轴看这确实是我需要的。谢谢这确实是我所需要的。谢谢