二维数组的向量化赋值
我在用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