生成一个布尔掩码,将一个数组索引到另一个数组中

时间:2012-09-12 06:16:16

标签: numpy pandas

很难解释我正在尝试用文字做什么,所以这是一个例子。

假设我们有以下输入:

In [76]: x
Out[76]: 
0    a
1    a
2    c
3    a
4    b

In [77]: z
Out[77]: ['a', 'b', 'c', 'd', 'e']

我想得到:

In [78]: ii
Out[78]: 
array([[1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0]])

ii是一个布尔掩码数组,可以应用于z以取回原始x

我目前的解决方案是编写一个函数,将z转换为list并使用index方法获取z中元素的索引,然后生成一行零,除了有一个的索引。此函数将应用于x的每一行以获得所需的结果。

3 个答案:

答案 0 :(得分:1)

第一种可能性:

>>> choices = np.diag([1]*5)
>>> choices[[z.index(i) for i in x]]

如其他地方所述,您可以按[z.index(i) for i in x]更改列表理解np.searchsorted(z, x)

>>> choices[np.searchsorted(z, x)]

请注意,正如@seberg的评论中所建议的那样,您应该使用np.eye(len(x))代替np.diag([1]*len(x))np.eye函数直接为您提供了一个2D数组,对角线为1,其他地方为0。

答案 1 :(得分:1)

对于z被排序的情况,这是numpy方法。你没有明确指出...如果大熊猫需要不同的东西,我不知道:

# Assuming z is sorted.
indices = np.searchsorted(z, x)

现在我真的不知道为什么你想要一个布尔掩码,这些索引可以应用于z来回馈x并且更紧凑。

z[indices] == x # if z included all x.

答案 2 :(得分:1)

很惊讶没有人提到outer的{​​{1}}方法:

numpy.equal