Python 比较字符串np数组中每个元素的最快方法

Python 比较字符串np数组中每个元素的最快方法,python,numpy,numpy-ufunc,Python,Numpy,Numpy Ufunc,我有一个字符串的numpy数组,其中一些是重复的,我想将每个元素与每个其他元素进行比较,以生成一个1和0的新向量,指示每对(I,j)是相同还是不同 e、 g.[“a”、“b”、“a”、“c”]->12个元素(4*3)向量[1,0,1,0,0,1,0,1,1,0,0,0,0,0,0,1] 有没有一种方法可以在numpy中快速执行此操作,而无需通过所有元素对进行双循环?我的数组有大约240000个元素,所以用这种简单的方法需要非常长的时间 我知道numpy.equal.outer,但显然numpy.

我有一个字符串的numpy数组,其中一些是重复的,我想将每个元素与每个其他元素进行比较,以生成一个1和0的新向量,指示每对
(I,j)
是相同还是不同

e、 g.
[“a”、“b”、“a”、“c”]
->12个元素(4*3)向量
[1,0,1,0,0,1,0,1,1,0,0,0,0,0,0,1]

有没有一种方法可以在numpy中快速执行此操作,而无需通过所有元素对进行双循环?我的数组有大约240000个元素,所以用这种简单的方法需要非常长的时间


我知道
numpy.equal.outer
,但显然
numpy.equal
不是在字符串上实现的,所以我似乎需要一些更聪明的方法来比较它们。

构建一个数组,其中包含字符串的哈希值(使用内置的
hash()
函数)

eg = ['a', 'b', 'c', 'a']
hashed = np.array([hash(s) for s in eg])
result = np.equal.outer(hashed, hashed)
产出:

[[ True False False  True]
 [False  True False False]
 [False False  True False]
 [ True False False  True]]
如果只有1个字符长的字符串,可以使用
ord()
而不是
hash()

给定一个长度为1的字符串,返回一个表示 参数为Unicode时字符的Unicode代码点 对象,或参数为8位字符串时的字节值。 例如,ord('a')返回整数97,ord(u'\u2020')返回 8224

tl;博士 你不会想要的

细节 首先,让我们注意到您实际上正在构建一个三角形矩阵:对于第一个元素,将其与其余元素进行比较,然后递归地重复其余元素。但是,您不使用三角形。在您的示例中,您只需切断对角线(每个元素始终等于自身),并将行合并到一个列表中

如果对源列表进行排序,则无需将每个元素与其余元素进行比较,只需与下一个元素进行比较。您必须使用元组保持元素的位置,以便在排序后跟踪它

您可以在O(n log n)时间内对配对列表进行排序,然后扫描它并查找所有匹配项(如果O(n)时间)。在您的案例中,排序和查找匹配项既简单又快速

在此之后,您必须创建“位向量”,即O(n^2)长。它将包含
len(你的向量)**2个
元素,或者一个240k元素向量包含576亿个元素。即使将每个元素表示为一位,也需要53.6 GB或8.7 GB的内存


很可能你不想那样。我建议您在O(nlogn)时间内找到一个对列表,也按O(nlogn)时间内的第一和第二位置对其进行排序,并通过查看该对列表重新创建所需位图的任何部分;二进制搜索确实有帮助。如果您的匹配项比元素对少得多,那么结果甚至可能适合RAM。

您是如何得到
[1,0,1,0,0,0,0,0,0]
?你能解释一下吗?也许可以实现一个双循环版本,我们可以尝试矢量化?你真的需要解释你的变换,从
[a,b,c,d]=>其他更好的东西