- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我定义一个形状为 (2, 2)
的数组 X
:
X = np.array([[1, 2], [3, 4]])
并获取克罗内克乘积,然后使用
reshape 输出np.kron(X, X).reshape((2, 2, 2, 2))
我得到一个结果矩阵:
array([[[[ 1, 2],
[ 2, 4]],
[[ 3, 4],
[ 6, 8]]],
[[[ 3, 6],
[ 4, 8]],
[[ 9, 12],
[12, 16]]]])
但是,当我使用np.tensordot(X, X,axes=0)
时,会输出以下矩阵
array([[[[ 1, 2],
[ 3, 4]],
[[ 2, 4],
[ 6, 8]]],
[[[ 3, 6],
[ 9, 12]],
[[ 4, 8],
[12, 16]]]])
这与第一个输出不同。为什么会这样呢?我发现this在寻找答案时,但我不明白为什么该解决方案有效,也不明白如何推广到更高的维度。
最佳答案
我的第一个问题是,为什么你期望它们是相同的?
让我们做kron
无需 reshape :
In [403]: X = np.array([[1, 2],
...: [3, 4]])
...:
In [404]: np.kron(X,X)
Out[404]:
array([[ 1, 2, 2, 4],
[ 3, 4, 6, 8],
[ 3, 6, 4, 8],
[ 9, 12, 12, 16]])
很容易将操作可视化。
[X*1, X*2
X*3, X*4]
tensordot
通常被认为是 np.dot
的概括,能够处理比常见矩阵乘积(即一个或多个轴上的乘积之和)更复杂的情况。但这里没有求和。
In [405]: np.tensordot(X,X, axes=0)
Out[405]:
array([[[[ 1, 2],
[ 3, 4]],
[[ 2, 4],
[ 6, 8]]],
[[[ 3, 6],
[ 9, 12]],
[[ 4, 8],
[12, 16]]]])
何时 axes
是一个整数而不是一个元组,该操作有点难以理解。文档说:
``axes = 0`` : tensor product :math:`a\otimes b`
我只是试图解释 axes
时发生的情况是一个标量(这并不简单) How does numpy.tensordot function works step-by-step?
指定axes=0
相当于提供这个元组:
np.tensordot(X,X, axes=([],[]))
无论如何,从输出中可以明显看出这个张量点产生相同的数字 - 但布局与 kron
不同。 。
我可以复制 kron
布局与
In [424]: np.tensordot(X,X,axes=0).transpose(0,2,1,3).reshape(4,4)
Out[424]:
array([[ 1, 2, 2, 4],
[ 3, 4, 6, 8],
[ 3, 6, 4, 8],
[ 9, 12, 12, 16]])
也就是说我交换了中间的两个轴。
省略 reshape ,我得到与 kron
相同的 (2,2,2,2) :
np.tensordot(X,X,axes=0).transpose(0,2,1,3)
<小时/>
我喜欢 np.einsum
的明确性:
np.einsum('ij,kl->ijkl',X,X) # = tensordot(X,X,0)
np.einsum('ij,kl->ikjl',X,X) # = kron(X,X).reshape(2,2,2,2)
或者使用广播,这 2 个产品是:
X[:,:,None,None]*X[None,None,:,:] # tensordot 0
X[:,None,:,None]*X[None,:,None,:] # kron
关于python - 为什么tensordot/reshape与kron不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52125078/
我对 numpy 中的矩阵乘法有一个特定的问题。这是一个例子: P=np.arange(30).reshape((-1,3)) array([[ 0, 1, 2], [ 3, 4, 5]
我正在 Tensorflow 中使用 tf.tensordot。但是,我遇到了一些困扰我的不一致之处。下面是一个可重现的例子: tf.reset_default_graph() tf.set_rand
可能有一个明显的解决方案,但我还没有找到。我想做一个简单的乘法,我有一个张量给我一种权重向量,另一个张量是堆叠张量(与权重相同)。使用 tf.tensordot 似乎很简单,但这不适用于未知的批量大小
关于原点的旋转是一个矩阵乘积,可以用numpy的点函数来完成, import numpy as np points = np.random.rand(100,3) # 100 X, Y, Z tup
我正在尝试加快我的代码以执行一些需要将 3 个矩阵与数组相乘的数值计算。问题结构如下: 数组的形状为 (N, 10) 第一个矩阵在数组的动态维度上是常量,形状为 (10, 10) 另外两个矩阵沿数组的
我想使用 tensordot 来计算两个张量的特定暗度的点积。喜欢: A 是张量,其形状为 (3, 4, 5) B 是张量,其形状为 (3, 5) 我想做一个点,使用 A 的第三个暗淡和 B 的第二个
我想了解如何 numpy.tensordot命令有效。我浏览了该论坛上发布的与此命令相关的不同问题。而且axes (1,0)表明axes 1 in a和axes 0 in b将进行总结。因此,我将沿着
我有一张从文件中读取的图像,形状为 (m,n,3)(即它有 3 个 channel )。我还有一个矩阵来转换尺寸为 (3,3) 的颜色空间。我已经找到了几种不同的方法来将这个矩阵应用于图像中的每个向量
我有一段代码,但我想提高性能。我的代码是: lis = [] for i in range(6): for j in range(6): for k in range(6):
我有一个张量 U,它由 n 个维度为 (d,k) 的矩阵和一个维度为 (k,n) 的矩阵 V 组成。 我想将它们相乘,以便结果返回维度为 (d,n) 的矩阵,其中第 j 列是 U 的矩阵 j 与 V
我正在 tensorflow 中实现 RBM。 并且使用小批量实现参数更新存在障碍 有 2 个张量 第一个张量的形状是 [100,3,1] 第二张量的形状是 [100,1,4] 数字 100 是批次的
我有一个长度为 m=10 的 n=3 向量的 NumPy 数组,所以 input.shape = (n,m,1)。我正在尝试使用 theano/numpy.tensordot 计算每个向量的外积,这样
对于当前的项目,我必须计算具有相同矩阵(非常稀疏)的许多向量的内积。这些向量与二维网格相关联,所以我将向量存储在一个三维数组中: 例如: X是一个暗淡的数组 (I,J,N) .矩阵A暗淡的 (N,N)
我正在尝试与 3D 张量的正面切片执行矩阵乘法,如下所示。如果 X.shape == (N, N) 且 Y.shape == (N, N, Y),则生成的张量应为 形状(N,N,Y)。 实现此目的的正
我正在尝试将张量 (m, n, o) 分解为矩阵 A(m, r)、B (n, r) 和 C (k, r)。这被称为 PARAFAC 分解。 Tensorly已经做了这种分解。 一个重要的步骤是将 A、
在 tensorflow 中,函数 tf.einsum、tf.matmul 和 tf.tensordot 都可以用于相同的任务。 (我意识到 tf.einsum 和 tf.tensordot 有更通用
我正在尝试扩展 numpy“tensordot”这样的东西:K_ijklm = A_ki * B_jml 可以这样写得更清晰:K = mytensordot(A,B,[2,0],[1,4,3]) 据我
NumPy 提供了非常有用的 tensordot功能。它允许您计算两个 ndarrays 沿任何轴(其大小匹配)的乘积。我很难在 PyTorch 中找到类似的东西。 mm 仅适用于二维数组,matmu
我是一名优秀的程序员,十分优秀!