我有一个问题,理解为什么以下不起作用:
我有一个可以是三维或六维的阵列前因子.我有一个有四个维度的阵列偶极子.前三个维度偶极场比赛的最后三个维度前因子.
由于我不知道前因子的形状,我使用省略号来说明前因子中的三个可选维度:
numpy.einsum('...lmn,lmno->...o', prefactor, dipoles)
Run Code Online (Sandbox Code Playgroud)
(在这里的示例中,prefactor.shape是(1,1,1,160,160,128),dipoles.shape是(160,160,128,3).执行时,我得到错误:
操作数1没有足够的尺寸来匹配广播,并且无法扩展,因为在开头和结尾都指定了爱因斯坦和下标
但是,当我向第二个术语添加省略号时,它确实有效:
numpy.einsum('...lmn,...lmno->...o', prefactor, dipoles)
Run Code Online (Sandbox Code Playgroud)
只是我不明白为什么,因为那里不应该有省略号.有人知道这里发生了什么吗?
在http://comments.gmane.org/gmane.comp.python.numeric.general/53705上也提出了同样的问题,但还没有令人满意的答案.
我知道我能做到np.subtract.outer(x, x).如果x有形状(n,),那么我最终得到一个有形状的数组(n, n).但是,我有一个x形状(n, 3).我想输出有形状的东西(n, n, 3).我该怎么做呢?也许np.einsum?
我正在使用 numpy einsum 计算形状为 (3,N) 的列向量 pts 数组与其自身的点积,从而产生形状为 (N,N) 的矩阵点积,以及所有点积。这是我使用的代码:
dotps = np.einsum('ij,ik->jk', pts, pts)
Run Code Online (Sandbox Code Playgroud)
这有效,但我只需要主对角线上方的值。IE。结果的上三角部分没有对角线。是否可以使用 einsum 仅计算这些值?或者以任何其他方式比使用 einsum 计算整个矩阵更快?
我的 pts 数组可能非常大,所以如果我只能计算我需要的值,那么我的计算速度就会加倍。
希望尽快进行此计算.我有X作为nxm numpy数组.我想将Y定义为以下内容:
Y_11 = 1 / (exp(X_11-X_11) + exp(X_11-X_12) + ... exp(X_11 - X_1N) ).
或Y_00
1/np.sum(np.exp(X[0,0]-X[0,:]))
所以基本上,Y也是nxm,其中i,j元素是1/sum_j'exp(X_ij - X_ij')
任何提示都会很棒!谢谢.
请求的示例代码:
np.random.seed(111)
J,K = 110,120
X = np.random.rand(J,K)
Y = np.zeros((J,K))
for j in range(J):
for k in range(K):
Y[j,k] = 1/np.sum(np.exp(X[j,k]-X[j,:]))
# note each row will sum to 1 under this operation
np.sum(Y,axis=1)
Run Code Online (Sandbox Code Playgroud) 我正在尝试尽快计算许多 3x1 向量对的叉积。这
\n\n\n\nn = 10000\na = np.random.rand(n, 3)\nb = np.random.rand(n, 3)\nnumpy.cross(a, b)\nRun Code Online (Sandbox Code Playgroud)\n\n给出了正确的答案,但受到类似问题的答案的启发,我认为这einsum会让我有所收获。我发现两者
eijk = np.zeros((3, 3, 3))\neijk[0, 1, 2] = eijk[1, 2, 0] = eijk[2, 0, 1] = 1\neijk[0, 2, 1] = eijk[2, 1, 0] = eijk[1, 0, 2] = -1\n\nnp.einsum(\'ijk,aj,ak->ai\', eijk, a, b)\nnp.einsum(\'iak,ak->ai\', np.einsum(\'ijk,aj->iak\', eijk, a), b)\nRun Code Online (Sandbox Code Playgroud)\n\n计算叉积,但它们的性能令人失望:两种方法的性能都比np.cross:
%timeit np.cross(a, b)\n1000 loops, best of 3: 628 \xc2\xb5s per loop\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n%timeit np.einsum(\'ijk,aj,ak->ai\', eijk, a, b)\n100 loops, …Run Code Online (Sandbox Code Playgroud) 有人可以解释广播(省略号)如何在numpy.einsum()函数中工作?
将非常感谢一些示例来说明如何以及何时使用它.
我检查了以下官方文档页面,但只有2个例子,我似乎无法理解如何解释它并使用它.
http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.einsum.html
一个python问题:我有一个np.einsum操作,我正在一对3d数组上做:
return np.einsum('ijk, ijk -> ik', input_array, self._beta_array)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是结果是2d; 该操作折叠'j'维度.我喜欢做的是让它保留'j'维度,类似于'keepdims'在np.sum函数中的工作方式.
我可以将结果包装在np.expand_dims中,但这对我来说似乎效率低下.我宁愿找到一些方法来调整einsum来输出我想要的东西.
这是真的吗?
目前我用
Na = (3, 2, 4)
Nb = Na[1:]
A = np.arange(np.prod(Na)).reshape(Na)
b = np.arange(np.prod(Nb)).reshape(Nb)
Run Code Online (Sandbox Code Playgroud)
我想计算:
r = np.empty((A.shape[0], A.shape[2])
for i in range(A.shape[2]):
r[:, i] = np.dot(A[:, :, i], b[:, i])
Run Code Online (Sandbox Code Playgroud)
在文字中:A是"4个矩阵的堆叠"(形状(3,2)),即3d-阵列,b是"4个矢量的堆叠"(形状(3,)),即2d阵列.期望的结果是"4个矩阵 - 矢量 - 产物的堆叠",即矢量堆栈,即同样是2d阵列(形状(3,4)).
我对np.einsum和np.tensordot有一个中等深度的外观,但我用这些构建的任何解决方案至少与我的循环解决方案一样长且不易读.
但是我觉得这个简单问题应该有一个单线程.
假设我有一个像这样的 numpy 矩阵:
[[ 1 2 3]
[ 10 100 1000]]
Run Code Online (Sandbox Code Playgroud)
我想用它自己计算每列的内积,所以结果是:
[1*1 + 10*10 2*2 + 100*100 3*3 + 1000*1000] == [101, 10004, 1000009]
Run Code Online (Sandbox Code Playgroud)
我想知道这是否可以使用该einsum函数(并更好地理解它)。
到目前为止,我能得到的最接近的结果是:
import numpy as np
arr = np.array([[1, 2, 3], [10, 100, 1000]])
res = np.einsum('ij,ik->jk', arr, arr)
# [[ 101 1002 10003]
# [ 1002 10004 100006]
# [ 10003 100006 1000009]]
Run Code Online (Sandbox Code Playgroud)
对角线包含预期结果,但我想知道是否可以避免边缘计算。
I want to realize component-wise matrix multiplication in MATLAB, which can be done using numpy.einsum in Python as below:
import numpy as np
M = 2
N = 4
I = 2000
J = 300
A = np.random.randn(M, M, I)
B = np.random.randn(M, M, N, J, I)
C = np.random.randn(M, J, I)
# using einsum
D = np.einsum('mki, klnji, lji -> mnji', A, B, C)
# naive for-loop
E = np.zeros(M, N, J, I)
for i in range(I):
for j …Run Code Online (Sandbox Code Playgroud) matlab sum multidimensional-array elementwise-operations numpy-einsum
我需要在以下代码中将 einsum 操作替换为标准 numpy 操作:
import numpy as np
a = np.random.rand(128, 16, 8, 32)
b = np.random.rand(256, 8, 32)
output = np.einsum('aijb,rjb->ira', a, b)
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助。
我有一个L张量(ndarray对象)列表,每个都有几个索引.我需要根据连接图收缩这些指数.
连接被编码在元组列表中,((m,i),(n,j))表示" 将张量的第i个索引与张量L[m]的第j个索引收缩" L[n].
如何处理非平凡连接图?第一个问题是,只要我收缩一对索引,结果就是一个不属于列表的新张量L.但即使我解决了这个问题(例如,通过为所有张量的所有索引提供唯一标识符),也存在一个问题,即人们可以选择任何顺序来执行收缩,而某些选择会在计算中期产生不必要的巨大影响(即使最终结果很小).建议?
我无法理解的文档np.einsum()。怎么subscripts解释?
我正在尝试在原始 python 上写出形状矩阵np.einsum('a...c,b...c', Y, conj(Y))在哪里。此外,由于之前的实现差异,我的 MATLAB的大小为。YC, F, TY[F, T, C]
'a...c,b...c'每个组件中的索引是什么?我很迷惑。
如何在 MATLAB 中编写相同的指令?
numpy-einsum ×13
numpy ×10
python ×9
ellipsis ×2
matlab ×2
performance ×2
sum ×2
arrays ×1
einsum ×1
matrix ×1
permutation ×1
python-3.x ×1
tensor ×1