我有两个numpy数组,第一个数组大小为100 * 4 * 200,第二个数组大小为150 * 6 * 200。实际上,我正在存储阵列1中4个场的200维矢量表示的100个样本和阵列2中6个场的200个维矢量的140个样本。
现在我想计算样本之间的相似性向量并创建一个相似性矩阵。对于每个样本,我想计算每个字段组合之间的相似性并存储它,以便得到15000 * 24维数组。
前150行将是阵列1的第1行与阵列2的150行之间的相似性向量,接下来的150行将是阵列1的第2行与阵列2的150行之间的相似性向量。 每个相似性矢量是阵列2中的#字段阵列2中的#字段,即相似矢量的第一个元素是阵列1的字段1和阵列2的字段1之间的余弦相似度,第二个元素将是阵列1的字段1之间的相似性数组2的字段2和最后一个元素的字段2是数组1的最后一个字段和数组2的最后一个字段之间的相似性。
使用numpy数组执行此操作的最佳方法是什么?
答案 0 :(得分:2)
所以每个“行”(我假设第一个轴,我称之为轴0)是样本轴。这意味着您有一个向量的100个样本,每个样本的字段x
维度4 x
200。
按照你描述的方式这样做,然后第一个数组的第一行将有(4,200),第二个数组将有(150,6,200)。然后你想在cos
和(m,n)
数组之间做(m,n,k)
距离,这是没有意义的(你最接近点数的产品就是张量积,我相当肯定不是你想要的。)
所以我们必须首先提取这些,然后迭代所有其他的。
要做到这一点,我实际上建议只使用np.split
拆分数组并迭代它们。这只是因为我从未在numpy中遇到过更快的方式。你可以使用张量流来提高效率,但我不会在答案中讨论这个问题。
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
a = np.random.rand(100, 4, 200)
b = np.random.rand(150, 6, 200)
# We know the output will be 150*100 x 6*4
c = np.empty([15000, 24])
# Make an array with the rows of a and same for b
a_splitted=np.split(a, a.shape[0], 0)
b_splitted=np.split(b, b.shape[0], 0)
i=0
for alpha in a_splitted:
for beta in b_splitted:
# Gives a 4x6 matrix
sim=cosine_similarity(alpha[0],beta[0])
c[i,:]=sim.ravel()
i+=1
对于上面的similarity
- 函数,我只选择了@StefanFalk sugested:sklearn.metrics.pairwise.cosine_similarity。如果这种相似性度量不够,那么你可以自己编写。
我根本没有声称这是在所有python中执行此操作的最佳方法。我认为最有效的方法是象征性地使用tensorflow
。
无论如何,希望它有所帮助!