【发布时间】:2015-11-26 08:58:54
【问题描述】:
我有两个矩阵:
import numpy as np
def create(n):
M = array([[ 0.33840224, 0.25420152, 0.40739624],
[ 0.35087337, 0.40939274, 0.23973389],
[ 0.40168642, 0.29848413, 0.29982946],
[ 0.17442095, 0.50982272, 0.31575633]])
return np.concatenate([M] * n)
A = create(1)
nof_type = A.shape[1]
I = np.eye(nof_type)
矩阵A 维度是4 x 3,我是3 x 3。
我想做的是
- 计算
A中每一行与I中每一行的距离分数。 - 对于
A中的每一行,报告I的行ID 和最高分
所以最终我们有 4 x 2 矩阵。 我如何做到这一点?
这是计算两个numpy数组之间距离分数的函数。
def jsd(x,y): #Jensen-shannon divergence
import warnings
warnings.filterwarnings("ignore", category = RuntimeWarning)
x = np.array(x)
y = np.array(y)
d1 = x*np.log2(2*x/(x+y))
d2 = y*np.log2(2*y/(x+y))
d1[np.isnan(d1)] = 0
d2[np.isnan(d2)] = 0
d = 0.5*np.sum(d1+d2)
return d
在实际情况下,A 的行数约为 40K。所以我们真的很喜欢它的速度。
使用循环方式:
def scoreit (A, I):
aoa = []
for i, x in enumerate(A):
maxscore = -10000
id = -1
for j, y in enumerate(I):
distance = jsd(x, y)
#print "\t", i, j, distance
if dist > maxscore:
maxscore = distance
id = j
#print "MAX", maxscore, id
aoa.append([maxscore,id])
return aoa
它打印这个结果:
In [56]: scoreit(A,I)
Out[56]:
[[0.54393736529629078, 1],
[0.56083720679952753, 2],
[0.49502813447483673, 1],
[0.64408263453965031, 0]]
当前时间:
In [57]: %timeit scoreit(create(1000),I)
1 loops, best of 3: 3.31 s per loop
【问题讨论】:
-
那么,
I总是一个身份数组? -
@Divakar:没错!
-
如果您已经尝试过和/或给定示例的预期输出,您能否添加任何循环代码?我只是不确定输出的形状如何
(4,2)。 -
另外,你能列出
A和I的形状吗? -
@Divakar:我用循环方式更新了。
标签: python arrays numpy matrix