我使用Python 2.7,numpy和pandas。
我有:
我需要构造一个二维数组D [i,j] = f(xi)* f(xj)其中i,j是[0,...,n-1]中的索引。
我可以使用循环和/或理解列表,但这会很慢。我想用矢量化方法代替。
我认为“numpy.indices”会对我有帮助(见Create a numpy matrix with elements a function of indices),但我承认我对如何使用该命令感到茫然。
提前致谢!
答案 0 :(得分:1)
忽略驳回矢量化的评论;这是一个很好的习惯,它确实可以通过合适的加速器提供性能。无论如何,我真正想说的是你想找到outer product:
x_ = numpy.array(x)
y = f(x_)
numpy.outer(y, y)
如果你正在处理数字,你应该使用numpy数据结构。然后你会得到像这样的快速,可读的代码。
答案 1 :(得分:0)
我想使用矢量化方法。
您听起来像是Matlab用户 - 您应该知道numpy's vectorize
function provides no performance benefit:
提供vectorize函数主要是为了方便,而不是为了方便 性能。实现基本上是for循环。
除非碰巧已经在numpy
中执行了一项完全符合您要求的操作,否则您将被卡住numpy.vectorize
并且无法真正获得for
}循环。话虽如此,你应该能够这样做:
def makeArray():
a = [1, 2, 3, 4]
def addTo(arr):
return f(a[math.floor(arr/4)]) * f(a[arr % 4])
vecAdd = numpy.vectorize(addTo)
return vecAdd(numpy.arange(4 * 4).reshape(4, 4))
编辑:
如果f
实际上是一维数组,则可以执行以下操作:
f_matrix = numpy.matrix(f)
D = f_matrix.T * f_matrix
答案 2 :(得分:0)
您可以使用fromfunc对该函数进行矢量化,然后使用点积乘以:
f2 = numpy.fromfunc(f, 1, 1) # vectorize the function
res1 = f2(x) # get the results for f(x)
res1 = res1[np.newaxis] # result has to be 2D for the next step
res2 = np.dot(a.T, a) # get f(xi)*f(xj)