很难解释我正在尝试用文字做什么,所以这是一个例子。
假设我们有以下输入:
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
的每一行以获得所需的结果。
答案 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