问题标签 [tensordot]

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.

0 投票
1 回答
44 浏览

python - 根据我的示例,有什么方法可以对 python 中的滚动互相关进行矢量化?

假设我有两个表示图片中像素的数组。

我想在“扫描”后者时构建一个较小图片和较大图片的像素的张量积数组。“扫描”是指在使用原始图片创建叠加层时对行和列进行迭代。

例如,可以以四种不同的方式将 2x2 图片叠加在 3x3 之上,因此我想生成一个包含匹配像素张量积的四元素数组。

Tensordot 是通过将 a[i,j] 与 b[i,j] 逐元素相乘并将各项求和来计算的。

请检查此代码:

计算单个像素非常容易,我所需要的只是 a 中的起始位置坐标。从那里我匹配b的大小并做一个 tensordot 产品。

但是,因为在迭代行和列时我需要对每个x 和 y位置重新执行此操作,所以我不得不使用循环,这当然不是最佳的。

在下一段代码中,我尝试利用 tensordot 的一个方便的特性,它也接受张量作为参数。换句话说,我可以为 a 的不同组合提供一个数组数组同时保持b相同。

尽管为了创建一个上述组合的数组,我想不出比使用另一个循环更好的方法,在这种情况下听起来很傻。

注意:张量大小是两个元组的总和,在这种情况下给出 (2, 2, 2, 2)

然而无论如何,即使我制作了这样的阵列,它的尺寸也太大了,无法实际使用。对于 1000x1000 的图片执行此操作,可能会消耗所有可用内存。

那么,还有其他方法可以避免这个问题中的循环吗?

0 投票
1 回答
37 浏览

python - NumPy 张量点分组计算

假设我有两个数组:

我想按元素乘以数组然后对元素求和,即1*1 + 2*2 + 3*3 + 4*4 = 30我可以使用:

现在,假设数组ab是 2×2×2 数组:

并且我想对每个组执行相同的操作,即[[1,2],[3,4]][[1,2],[3,4]]then 元素相加的时间,与[[5,6],[7,8]]. 结果应该是array([ 30, 174]), where30 = 1*1 + 2*2 + 3*3 + 4*4174 = 5*5 + 6*6 + 7*7 + 8*8。有没有办法使用 tensordot 做到这一点?

PS
我明白在这种情况下你可以简单地使用 sum 或 einsum:

但这只是一个简化的示例,我需要使用它,tensordot因为它更快。

谢谢你的帮助!!

0 投票
1 回答
93 浏览

numpy - 具有共享非收缩轴的 numpy einsum/tensordot

假设我有两个数组:

并希望对最后 3 个轴求和,并保留共享轴。输出维度应该是(32,6,6,20,128)。注意这里带有 20 的轴在a和中是共享的b。让我们将此轴称为“组”轴。

我有两种方法来完成这项任务:
第一种方法很简单einsum

在第二种方法中,我遍历组维度并使用einsum/tensordot计算每个组维度的结果,然后将结果堆叠:

这是我的 jupyter notebook 中这两种方法的时间安排: 我们可以看到带有循环的第二种方法比第一种方法快。
在此处输入图像描述

我的问题是:

  1. 为什么method1慢得多?它不会计算更多的东西。
  2. 有没有更有效的方法而不使用循环?(我有点不愿意使用循环,因为它们在 python 中很慢)

谢谢你的帮助!

0 投票
2 回答
25 浏览

numpy - numpy中tensordot的内置索引相关权重?

我想获得两个具有相同形状的数组的张量点,并应用了与索引相关的权重,而不使用显式循环。例如,

C可以使用内置工具(例如,使用 tensordot 的一些选项)获得类似的数组吗?