Numpy 矩阵行比较

Numpy matrix row comparison

问题更侧重于计算性能。

我有 2 个列数相同但行数不同的矩阵。一个矩阵是 'pattern',其行必须分别与其他矩阵行(所有行)进行比较,然后才能提取均值等于模式、标准、... 所以,我有以下矩阵,计算如下:

numCols = 10
pattern = np.random.randint(0,2,size=(7,numCols))
matrix = np.random.randint(0,2,size=(5,numCols))

comp_mean = np.zeros(pattern.shape[0])
for i in range(pattern.shape[0]):
    comp_mean[i] = np.mean(np.sum(pattern[i,:] == matrix, axis=1))

print comp_mean # Output example: [ 1.6  1.   1.6  2.2  2.   2.   1.6]

这很清楚。问题是两者的矩阵行数要大得多(~1.000.000)。所以这段代码运行得很慢。我尝试实现 numpy syntaxis,因为有时它会缩短计算时间,这让我感到惊讶。所以我做了以下代码(它可能很奇怪,但它有效!):

comp_mean = np.mean( np.sum( (pattern[np.repeat(np.arange(pattern.shape[0]), matrix.shape[0])].ravel() == np.tile(matrix.ravel(),pattern.shape[0])).reshape(pattern.shape[0],matrix.shape[0],matrix.shape[1]), axis=2 ),axis=1)
print comp_mean

但是,此代码比使用 'for' bucle 的前一个代码慢。所以我想知道有没有可能加快计算速度。

编辑

我检查了运行不同方法对真实矩阵的时间,结果如下:

编辑(2)

前 运行s 在笔记本电脑上执行。我在桌面上有 运行 代码。我避免了最坏的结果,新的 运行 时间现在不同了:

这里可以推荐一些 broadcasting 的方法。

方法 #1

out = np.mean(np.sum(pattern[:,None,:] == matrix[None,:,:],2),1)

方法 #2

mrows = matrix.shape[0]
prows = pattern.shape[0]
out = (pattern[:,None,:] == matrix[None,:,:]).reshape(prows,-1).sum(1)/mrows

方法 #3

mrows = matrix.shape[0]
prows = pattern.shape[0]
out = np.einsum('ijk->i',(pattern[:,None,:] == matrix[None,:,:]).astype(int))/mrows
# OR out = np.einsum('ijk->i',(pattern[:,None,:] == matrix[None,:,:])+0)/mrows

方法 #4

如果 matrix 中的行数很大,最好坚持 for 循环以避免这种情况下的巨大内存需求,这也可能导致运行缓慢.相反,我们可以在每次循环迭代中进行一些优化。这是显示的一种可能的优化 -

mrows = matrix.shape[0]
comp_mean = np.zeros(pattern.shape[0])
for i in range(pattern.shape[0]):
    comp_mean[i] = (pattern[i,:] == matrix).sum()
comp_mean = comp_mean/mrows

你能试试这个吗:

import scipy.ndimage.measurements

comp_mean = np.zeros(pattern.shape[0])
for i in range(pattern.shape[0]):
    m = scipy.ndimage.measurements.histogram(matrix,0,1,2,pattern[i],[0,1])
    comp_mean[i] = m[0][0]+m[1][1]
comp_mean /= matrix.shape[0]

此致。