如何使用numpy哪里有几个可能的值?

时间:2016-02-29 13:07:37

标签: python numpy vectorization

考虑一个名为picks_user的numpy ndarray,其形状为picks_user.shape = (2016,3)。 '列'表示该顺序中的变量user,item和count。 '行'代表观察。

执行时:

target_users = picks_user[np.where(picks_user[:,1]== 2711)][:,0]

结果是另一个numpy ndarray,用户有选择项目2711。

假设target_users具有形状target_users.shape = (14,)。我想使用这个数组来获取目标用户选择的所有项目,如下所示(这不起作用):

picks_user[np.where(picks_user[:,1] == target_users)]

这可能相当于:

for element in target_users:
     picks_user[np.where(picks_user[:,1] == element]

如何以矢量化方式实现此目的,不能用于循环?

更新

考虑以下示例:

a = np.array([ [1,10,1],[2,11,1],[3,12,1],[4,13,1],[5,10,1],[2,13,1],[1,11,1],[5,16,1]])
target_users = a[np.where(a[:,1]==10)][:,0]

在这种情况下target_users = [1 5]

我想要的矢量是:

[[1,10,1],[5,10,1],[1,11,1],[5,16,1]]

1 个答案:

答案 0 :(得分:3)

您可以将np.in1d用作:

>>> picks_user = np.random.randint(0,10, (10,3))
>>> picks_user
array([[7, 8, 7],
       [6, 0, 9],
       [5, 6, 7],
       [6, 7, 3],
       [0, 1, 3],
       [8, 7, 5],
       [2, 6, 6],
       [7, 9, 8],
       [1, 7, 1],
       [9, 8, 4]])
>>> target_users = np.array([1,7,8])
>>> picks_user[np.in1d(picks_user[:,1], target_users)]
array([[7, 8, 7],
       [6, 7, 3],
       [0, 1, 3],
       [8, 7, 5],
       [1, 7, 1],
       [9, 8, 4]])