问题标签 [numpy-einsum]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
numpy - Numpy - 为 3-d 网格上的所有网格点查找到测试点的 3-d 距离
我尝试了 np.hypot() 和 np.linalg.norm() 但它们都有一些问题(至少我是如何使用 thm 的)。
我很确定 np.hypot 只能计算 2-d distance。如果我有一个测试点 P (1,1,1) 和一个网格点 G (3,3,3),那么网格点 G 的返回值将类似于:((3-1)^2+( 3-1)^2)^(0.5) = 2.82
我可以直接调用 np.hypot,而不必循环通过网格点(我猜循环很慢,因此很糟糕),并且我在 3-d 的所有网格点处返回了这些到测试点的距离值meshgrid,但不计算 z 依赖关系(即 (1,2,0) 处的 d = (1,2,3) 处的 d:
使用 np.linalg.norm,我不知道如何在网格上的所有点上按元素计算返回值,传入的参数似乎是点 A(网格点)和点 B(测试点),但后来我除了循环之外,想不出任何方法来计算所有网格点,如下所示:
有谁知道我如何为 3d 网格上的所有网格点找到到测试点的真实 3d 距离?
python-3.x - 计算两个数组列的成对和的总和
我正在寻找一种方法来避免以下代码段中的嵌套循环,其中A
和B
是二维数组,每个形状都(m, n)
带有m
,n
beeing 任意正整数:
上面的逻辑大致等价于
除了einsum
计算产品的总和。
有没有一种方法,相当于einsum
计算总和的总和?还是我必须为此操作编写扩展程序?
python - np.einsum 4 矩阵乘法的性能
给定以下 3 个矩阵:
我einsum
用来计算:
但我发现它的性能要差得多:
我不明白为什么。
总的来说,我正在尽可能地优化这段代码。我已经阅读了有关该np.tensordot
功能的信息,但我似乎无法弄清楚如何将它用于给定的计算。
matlab - 优化张量乘法
我有一个我正在尝试优化的实时图像处理程序,这一切都归结为矩阵乘法。考虑我在初始化阶段计算的 3 个张量:
A = np.arange(35 * 51 * 59).reshape([35, 51, 59])
B = np.arange(37 * 51 * 51 * 59).reshape([37, 51, 51, 59])
C = np.arange(59 * 27).reshape([59, 27])
每一帧,我都会以第四张量的形式获得一个新数据:
M = np.arange(35 * 37 * 59).reshape([35, 37, 59])
.
目前,我正在计算D = np.einsum('xyf,xtf,ytpf,fr->tpr', M, A, B, C)
,D
我想要的结果在哪里,这是程序的主要瓶颈。为了优化它,我试图遵循两个方向。
首先我尝试提出一个张量T
,我可以预先计算一个函数A, B, C, D
,然后它会全部沸腾为D = np.tensordot(M, T, axes=..)
. 我没有成功。我花了很多时间,这甚至可能吗?
此外,程序本身是用 MATLAB 编写的。由于它没有内置的张量乘法函数(einsum
或tensordot
等效函数),我目前正在使用该tprod
工具箱,并且正在执行以下操作:
由于 MATLAB 中的默认点积函数(用于 2D 矩阵)要快得多etprod
,因此我想A, B, C, D
以一种能够使用默认函数处理多个 2D 矩阵的方式将其重塑为 2D 数组,而无需手动编写for
循环。我也没有成功。
有什么想法吗?谢谢!
python - Numpy einsum 二维数组的外部总和
我试图寻找答案,但找不到我需要的东西。抱歉,如果这是一个重复的问题。
假设我有一个 shape 的二维数组(n, n*m)
。我想要做的是这个数组的外部总和到它的转置,从而产生一个形状为的数组(n*m, n*m)
。例如,假设我有
我想做一个外部总和,A
这样A.T
输出是:
请注意,这np.add.outer
不起作用,因为它将输入分解为向量。我可以通过做类似的事情
但这在相当大(和n
)时似乎不合理。是否可以使用 来写这个总和?我只是似乎无法弄清楚。m
n > 100
m > 1000
einsum
einsum
python - Python:数组的numpy数组的外积的所有排列的总和
我有一个数组 Ai 的 numpy 数组,我希望每个外部乘积 (np.outer(Ai[i],Ai[j])) 与缩放乘数相加以产生 H。我可以逐步完成并制作它们然后 tensordot它们带有比例因子矩阵。我认为事情可以大大简化,但还没有找到一种通用/有效的方法来为 ND 做到这一点。如何更容易地生成 Arr2D 和 H?注意:Arr2D 可以是 64 个二维数组,而不是 8x8 二维数组。
python - 用于高维度的 Einsum
考虑以下 3 个数组:
我想将矩阵 X 的每一列添加和求和到 W 的行,由 y 作为索引给出。因此,例如,如果 y 中的第一个元素是 3 ,我会将 X 的第一列添加到 W 的第四行(python 中的索引 3)并求和。我会一遍又一遍地做,直到 X 的所有列都添加到 W 的特定行并求和。我可以用不同的方式做到这一点:1-使用for循环:
2-使用 add.at 功能
3-但我不明白如何使用 einsum 来做到这一点。我得到了一个解决方案,但真的无法理解。
任何人都可以解释我这个结构吗?1 - (np.arange(N)[:,None,None] == y.ravel(),X)。我想这部分是指根据 y 将 X 的列与 W 的特定行相加。但是 W 在哪里?在这种情况下,为什么我们必须将 W 转换为 4 维?2- 'ijk,lk->il' - 我也不明白这一点。
i - 指行,j - 列,k- 每个元素,l - 'l' 也指什么?如果有人能理解这一点并向我解释,我将不胜感激。提前致谢。
python - einsums的numpy组成?
假设我有一个np.einsum
执行一些计算的设备,然后将其直接泵入另一个np.einsum
执行其他操作。一般来说,我可以将这两个einsum
s 组合成一个 seinsum
吗?
我的具体用例是我正在做一个转置,一个矩阵乘法,然后是另一个矩阵乘法来计算b a^T a
:
python - Numpy einsum_path 报告更多 FLOP 和“减速”
对于这个话题np.einsum
,我已经阅读了一堆讨论:
为了更多地了解为什么np.eimsum
比通常np.sum
的 ,np.product
等更快(即使对于 anaconda 中的最新 numpy 版本),我正在使用np.einsum_path
来查看优化过程优化了什么。
这样做的时候,我发现了一个有趣的现象。考虑这个最小的例子:
输出都是相同的:
优化的 FLOP在哪里增加(这意味着更多的计算?)并且理论加速比小于 1(这意味着更慢)。但是,如果我们实际计算计算时间:
如果我们查看对应于“本机”时序除以优化时序的第二列,它们都接近 1,这意味着优化并没有使其变慢:
我想知道伤口会np.einsum_path
说它需要更多的 FLOP 并且它更慢?我相信时间是直接从 FLOP 的数量计算出来的,所以这两个基准基本上指的是同一件事。
顺便说一句,我附上了一个示例,显示np.einsum_path
“通常”如何表现以说服上面的结果是异常的:
输出:
python - 优化数学计算
我有一个购买一对物品的四种可能性的模型(同时购买,不购买或只购买一个),并且需要优化(伪)对数似然函数。当然,其中一部分是伪对数似然函数的计算/定义。
以下是我的代码,其中 Beta 是每个客户的二维向量(有 U 个客户和 U 个不同的 beta 向量),X 是每个项目的二维向量(N 个项目中的每一个都不同)和 Gamma是一个对称矩阵,每对项目都有一个标量值 gamma(i,j)。df 是购买的数据框 - 每个客户一行,项目 N 列。
在我看来,所有这些循环都效率低下并且占用了太多时间,但我不确定如何加快计算速度,如果能帮助改进它,我将不胜感激。先感谢您!
添加/澄清 - 我正在使用此计算来优化和查找生成此伪似然函数数据的 beta 和 gamma 参数。
我正在使用 scipy optimize.minimize 和 'Powell' 方法。