1

很难解释我想用文字做什么,所以这里有一个例子。

假设我们有以下输入:

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为 a的函数,list并使用该index方法获取元素的索引,z然后生成一行零,除了有一个索引的索引。此函数被应用于每一行x以获得所需的结果。

4

3 回答 3

1

Surprised no one mentioned theouter method of numpy.equal:

In [51]: np.equal.outer(s, z)
Out[51]: 
array([[ True, False, False, False, False],
       [ True, False, False, False, False],
       [False, False,  True, False, False],
       [ True, False, False, False, False],
       [False,  True, False, False, False]], dtype=bool)

In [52]: np.equal.outer(s, z).astype(int)
Out[52]: 
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]])
于 2012-10-24T16:23:56.793 回答
1

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

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

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

z[indices] == x # if z included all x.
于 2012-09-12T08:47:14.890 回答
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函数直接为您提供一个二维数组,其中对角线为 1,其他位置为 0。

于 2012-09-12T08:15:50.417 回答