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