【发布时间】:2015-01-07 21:35:18
【问题描述】:
问题是,给定任意一维向量 y,将其扩展为具有 n 维度的 d 基向量。
展开的规则是:y中的每个元素都是n*n单位矩阵中列的索引。
例如:
y = [3, 0, 1]
n = 4
由于n = 4,我们有4*4 单位矩阵:
[1, 0, 0, 0]
[0, 1, 0, 0]
[0, 0, 1, 0]
[0, 0, 0, 1]
使用规则展开每个元素y,我们有:
[0, 1, 0]
[0, 0, 1]
[0, 0, 0]
[1, 0, 0]
我想用theano来解决这个问题,n(>50k)很大,y(>10k)很长,所以效率很重要。
使用 numpy 的解决方案是微不足道的,但是 numpy.eye 函数可能会花费太多,我们可以使用另一种方法使其更快。比较以下方法:
import numpy as np
import theano
import theano.tensor as T
n = 25500
y_value = np.asarray([2, 0, 10, 4], dtype='int32')
# method 1
%timeit np.eye(n)[y_value]
# 10 loops, best of 3: 56.9 ms per loop
# method 2
def vec(i):
e = np.zeros(n)
e[i] = 1
return e
%timeit np.vstack([vec(i) for i in y_value])
# 100 loops, best of 3: 16.3 ms per loop
但是,第二种方法在 theano 中可能不起作用,因为符号变量中的循环可能不是微不足道的。有没有办法避免使用T.eye?
y_value 可以是任意一维向量。
【问题讨论】: