关于python:二维数组的向量化赋值 | 您所在的位置:网站首页 › 在家里大蒜苗怎么种 › 关于python:二维数组的向量化赋值 |
我使用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矩阵),但是我承认我对如何使用该命令感到迷惑。 谢谢! 相关讨论 您确实需要在此处显示输入和输出的示例 例如,i和j是否在所有索引范围内,还是您想要特定的索引? 这听起来像是我的基本广播。 x[None,:] * y[:,None]。但是我们需要更多地了解f才能给出一个好的答案。 i和j的范围是[0,1,...,n-1]中的每个值,因此D是具有n行n列的方阵。 f()是一个实数标量函数。我们可以使用exp(。)为例。我的f()不同,但我认为这并不重要 @Charles关键是您的函数可以向量化。 是的,例如如果def f(x): return np.exp(x)是您的函数,则y = f(x); D = y * y[:,None]应该起作用,但是如果是math.exp(x),则不会起作用。 是的,我明白了。让我重新描述问题,以便它更易于向量化(也许)。 f实际上是长度为n的维数组,所以我的问题实际上是构造一个元素为D [i,j] = f [i] * f [j]的方阵,其中i和j的范围为[0] ,...,n-1]-对不起,如果我之前不清楚 @Charles这有很大的不同,请参阅我编辑的答案。 senderle的建议可以解决问题:D = f [None,:] * f [None ,:]有效。再次感谢忽略忽略矢量化的注释;这是一个好习惯,并且使用正确的加速器确实可以提供性能。无论如何,我真正想说的是您想找到外部产品: 123x_ = numpy.array(x) y = f(x_) numpy.outer(y, y)如果要使用数字,则无论如何都应该使用numpy数据结构。然后,您将获得快速,可读的代码,如下所示。 相关讨论 别客气。如果发现答案有帮助,建议您将其投票。 我会的,但是我没有足够的信誉积分!仍然对所有人来说都是新的。您可以使用fromfunc对函数进行矢量化,然后使用点积相乘: 1234f2 = 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)I would like to use a vectorized approach instead. 听起来您可能是Matlab用户-您应该意识到numpy的vectorize函数没有任何性能上的好处: The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop. 除非碰巧发生了numpy中已经存在完全可以执行您想要的操作的情况,否则您将被numpy.vectorize困住,并且没有什么可以真正受益于for循环。话虽如此,您应该能够像这样: 123456def 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实际上是一维数组,则可以执行以下操作: 12f_matrix = numpy.matrix(f) D = f_matrix.T * f_matrix 相关讨论 谢谢大家的建议。很有用。 说" numpy的矢量化操作没有性能优势"是非常令人误解的。使用vectorize函数不提供任何功能。但是用numpy行话来说,如果一个操作不使用Python循环(例如, x**0.5+np.sin(x)。 @DSM您是对的,我编辑了回复以使内容更清楚。我的观点更多是建议,对于任意函数f,不太可能从numpy中获得所需的内容。告诉我您是否仍然不清楚我的答案。 几乎所有任意函数都可以重写,以利用numpy中的矢量化优势:如果您可以用Python编写它,则很可能用numpy编写它。 @Jaime def f(): return len(requests.get('http://www.google.com').text)之类的东西怎么样?还是def f(): print"Hello World"; return 5?还是def f(): return hashlib.md5(open('hello.txt').read())?大多数Python函数不是线性代数中的运算,因此,大多数函数没有简单的numpy实现。 @PatrickCollins:感谢您的编辑,这也可以正常使用。 |
CopyRight 2018-2019 实验室设备网 版权所有 |