相关疑难解决方法(0)

了解NumPy的einsum

我很难理解究竟是如何einsum运作的.我看过文档和一些例子,但它似乎并不坚持.

这是我们在课堂上看到的一个例子:

C = np.einsum("ij,jk->ki", A, B)
Run Code Online (Sandbox Code Playgroud)

对于两个数组AB

我想这会采取A^T * B,但我不确定(它正在将其中一个的转置正确吗?).任何人都可以告诉我这里发生了什么(通常在使用时einsum)?

python arrays numpy multidimensional-array numpy-einsum

160
推荐指数
6
解决办法
4万
查看次数

为什么numpy的einsum比numpy的内置函数更快?

让我们从三个数组开始dtype=np.double.使用numpy 1.7.1在intel CPU上执行计时,编译icc并链接到intel mkl.带有numpy 1.6.1的AMD cpu与gccwithout 编译mkl也用于验证时序.请注意,时序与系统大小几乎呈线性关系,并不是由于numpy函数if语句中产生的小开销,这些差异将以微秒而非毫秒显示:

arr_1D=np.arange(500,dtype=np.double)
large_arr_1D=np.arange(100000,dtype=np.double)
arr_2D=np.arange(500**2,dtype=np.double).reshape(500,500)
arr_3D=np.arange(500**3,dtype=np.double).reshape(500,500,500)
Run Code Online (Sandbox Code Playgroud)

首先让我们看一下这个np.sum函数:

np.all(np.sum(arr_3D)==np.einsum('ijk->',arr_3D))
True

%timeit np.sum(arr_3D)
10 loops, best of 3: 142 ms per loop

%timeit np.einsum('ijk->', arr_3D)
10 loops, best of 3: 70.2 ms per loop
Run Code Online (Sandbox Code Playgroud)

鲍尔斯:

np.allclose(arr_3D*arr_3D*arr_3D,np.einsum('ijk,ijk,ijk->ijk',arr_3D,arr_3D,arr_3D))
True

%timeit arr_3D*arr_3D*arr_3D
1 loops, best of 3: 1.32 s per loop

%timeit np.einsum('ijk,ijk,ijk->ijk', arr_3D, arr_3D, arr_3D)
1 loops, best of 3: 694 ms per loop
Run Code Online (Sandbox Code Playgroud)

外产品:

np.all(np.outer(arr_1D,arr_1D)==np.einsum('i,k->ik',arr_1D,arr_1D)) …
Run Code Online (Sandbox Code Playgroud)

python arrays performance numpy multidimensional-array

69
推荐指数
4
解决办法
9732
查看次数

将几个矩阵乘以numpy

假设你有n个方矩阵A1,...,An.无论如何要以整齐的方式将这些矩阵相乘吗?据我所知,numpy中的dot只接受两个参数.一种显而易见的方法是定义一个函数来调用自身并获得结果.有没有更好的方法来完成它?

python numpy

29
推荐指数
3
解决办法
3万
查看次数

为什么numpy.dot比numpy.einsum快得多?

我用OpenBlas编译了numpy,我想知道为什么einsum比dot慢得多(我理解在3个索引的情况下,但我不明白为什么它在两个索引情况下的性能也不太好)?这是一个例子:

import numpy as np
A = np.random.random([1000,1000])
B = np.random.random([1000,1000])

%timeit np.dot(A,B)

Out: 10 loops, best of 3: 26.3 ms per loop

%timeit np.einsum("ij,jk",A,B)

Out: 5 loops, best of 3: 477 ms per loop
Run Code Online (Sandbox Code Playgroud)

有没有办法让einsum使用OpenBlas和numpy.dot这样的并行化?为什么np.einsum不只是在注意到点积时调用np.dot?

python numpy linear-algebra openblas

5
推荐指数
1
解决办法
1381
查看次数