Numpy 生成将一个数组索引为另一个数组的布尔掩码

Numpy 生成将一个数组索引为另一个数组的布尔掩码,numpy,pandas,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,

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

假设我们有以下输入:

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

第一种可能:

>>> choices = np.diag([1]*5)
>>> choices[[z.index(i) for i in x]]
如其他地方所述,您可以通过
np.searchsorted(z,x)


请注意,正如在的注释中所建议的,您应该使用
np.eye(len(x))
而不是
np.diag([1]*len(x))
np.eye
函数直接为您提供一个二维数组,对角线上为1,其他地方为0。

这是对z进行排序的numpy方法。你没有说。。。如果熊猫需要不同的东西,我不知道:

# Assuming z is sorted.
indices = np.searchsorted(z, x)
现在我真的不知道你为什么想要一个布尔掩码,这些索引可以应用于z来返回x,并且更加紧凑

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

令人惊讶的是,没有人提到
numpy.equal的
outer
方法:

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]])

那么,你的问题是什么?写这个函数?当然,类似于
np.choose([“abcde.index(i)for i in x],“abcde”)
的东西对您不起作用?好吧,当我运行您的行时,我会得到
数组(['a','a','c','a','b',,dtype='S1')
。我想要的是
['a',a',c',a',b']
的掩码(5个布尔元素的列表)。这能让事情更清楚吗?你是在寻找一种更快的方法,还是仅仅是一种更短的键入方式,比如:np.array([[j==i for j in z]for i in x],dtype=int)@wouterovermei如果两者都是理想的,那么幸运的是它们没有被排序,我的例子是误导性的。我还需要面具,因为我在那之后用概率矩阵乘以它们:如果它们是唯一的,首先自己排序,如果你关心速度的话。至于布尔数组的创建,我建议类似于
a=np.zeros((…,…),dtype=bool);a[np.ix_U9;[np.arange(…),z]=1
可能。但没什么大不了的。如果我对它们进行排序,那么我必须对所有其他需要匹配的数组和矩阵的列进行排序。不确定是否值得。第一个是我正在寻找的。我想,与其使用
np.diag([1]*5)
,不如使用
np.eye(5)
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]])