二维数组的向量化赋值

0 投票
3 回答
1247 浏览
提问于 2025-04-18 09:57

我在用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”可能会对我有帮助(见创建一个numpy矩阵,元素是索引的函数),但我承认我不知道怎么用这个命令来达到我的目的。

谢谢大家!

3 个回答

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)
1

别理那些说向量化没用的评论;其实,养成这个习惯是很好的,而且在合适的加速器下,它确实能提高性能。总之,我想说的是,你需要找到外积

x_ = numpy.array(x)
y = f(x_)
numpy.outer(y, y)

如果你在处理数字,最好使用numpy的数据结构。这样你就能写出既快速又易读的代码。

0

我想用一种向量化的方法来处理。

听起来你可能是个Matlab用户——你应该知道,numpy的vectorize函数并没有性能上的优势

这个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

撰写回答