关于python:二维数组的向量化赋值 您所在的位置:网站首页 在家里大蒜苗怎么种 关于python:二维数组的向量化赋值

关于python:二维数组的向量化赋值

2023-04-21 06:07| 来源: 网络整理| 查看: 265

我使用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 实验室设备网 版权所有