二维数组的矢量化赋值

时间:2014-06-16 15:08:09

标签: python numpy pandas

我使用Python 2.7,numpy和pandas。

我有:

  • 函数y = f(x)其中x和y都是标量
  • 长度为n的标量的一维数组:[x0,x1,...,x(n-1)]

我需要构造一个二维数组D [i,j] = f(xi)* f(xj)其中i,j是[0,...,n-1]中的索引。

我可以使用循环和/或理解列表,但这会很慢。我想用矢量化方法代替。

我认为“numpy.indices”会对我有帮助(见Create a numpy matrix with elements a function of indices),但我承认我对如何使用该命令感到茫然。

提前致谢!

3 个答案:

答案 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)