Python 如何在numpy/scipy/pandas中生成匹配的矩阵/数组?

Python 如何在numpy/scipy/pandas中生成匹配的矩阵/数组?,python,numpy,scipy,numpy-ndarray,Python,Numpy,Scipy,Numpy Ndarray,我需要一个布尔数组,用于指示列表/序列中的某个项是否与同一数组中的其他项匹配。如果我知道怎么称呼它的话,这可能是一个单一的scipy函数,但我的搜索并没有取得成果。下面的代码符合我的需要,但可能会从矢量化中受益 import numpy as np colors = ['red', 'green', 'blue', 'red', 'red', 'yellow'] match_array = np.ndarray((len(colors), len(colors)), dtype=bool)

我需要一个布尔数组,用于指示列表/序列中的某个项是否与同一数组中的其他项匹配。如果我知道怎么称呼它的话,这可能是一个单一的scipy函数,但我的搜索并没有取得成果。下面的代码符合我的需要,但可能会从矢量化中受益

import numpy as np

colors = ['red', 'green', 'blue', 'red', 'red', 'yellow']
match_array = np.ndarray((len(colors), len(colors)), dtype=bool)

for i, y in enumerate(colors):
    for j, x in enumerate(colors):
        match_array[i][j] = (x == y)

print(match_array)
输出:

[[ True False False  True  True False]
 [False  True False False False False]
 [False False  True False False False]
 [ True False False  True  True False]
 [ True False False  True  True False]
 [False False False False False  True]]

正如预期的那样,它围绕对角线对称,并在两个轴上将索引0处的“红色”与索引3和4处的其他“红色”相匹配。是否有一个库函数可以更有效地执行此操作?

如果您可以将类别转换为索引或数字,广播将为您提供一切

c_num = np.array([0,1,2,0,0,3])  # mimic colors
match_array = c_num[:,None] == c_num

这会给出相同的结果。

字符串数据类型的数组正好可以做到这一点,所以只需
np.array(colors)