假设矩阵A具有m x r大小,而B具有n x r。在NumPy中,如何在A和B之间进行列级外积?
也就是说,我想要一个矩阵,C (大小:m x n x r),其中C[:, :, i]是A[:, i]和B[:, i]的外部乘积。
当然,我可以在列上使用for循环,但是我想知道是否有一种矢量化的方法来加快计算速度?
我有两个大小相同的矩阵P1和P2。我取它们的行P1j和P2j,并通过使用numpy的外积形成矩阵。在python循环格式中,这是通过形成矩阵A的列表来实现的
for j in range(0,np.shape(P1)[0]):
A[j] = np.outer(P1[j],P2[j])
我想将这个操作向量化。
我有shape (2, s, t, ...)的numpy数组,我想将它们彼此相乘,这样输出就会有shape (2, ..., 2, s, t, ...) d d 2s。例如,使用d==3
import numpy
d = 3
a = numpy.random.rand(d, 2, 7, 8)
out = numpy.empty((2, 2, 2, 7, 8))
for i in range(2):
for j in range(2):
for k in range(2):
out[i, j, k] = a[0][i]*a[1][j]*a[2]
假设我有A(KxMxN)和B(KxLxN)矩阵,其中L,M,N是小的,K是一个大数。我想计算外积,利用最后2维数沿第1维得到矩阵C(KxMxL)。
我可以通过对"K“中的每个索引k运行一个for循环来做到这一点,并对2D矩阵使用numpy的matmul函数
out = [np.matmul(x,y.T) for x, y in zip(A, B)]
out=np.asarray(out)
我想知道,如果没有for循环/理解,我是否可以这样做,因为K是一个非常大的数字。
我有两个向量,比如A:1xN和B:1xM。我想计算它们的外积,并将结果添加到NxM矩阵中。现在,我将其分成两部分,首先计算(A')B,然后将其相加。在分析时,第一步比加法(8倍)花费更多的时间。由于第一步中的乘法次数与第二步中的加法次数相同,是不是因为我的架构支持更快的加法?或者是为存储第一步的结果分配内存所花费的时间?
>> x = randn(1,10000);
>> y = randn(1,10000);
>> tic; z=x'*y; toc;
Elapsed time is 0.560743 seconds.
>> ti
我想把矩阵T的元素与两个向量vec_1和vec_2的元素相乘,然后求和。使用嵌套的for循环,我可以这样做: T = eye(3);
vec_1 = [4,5,6];
vec_2 = [7,8,9];
tot = 0;
for m=1:3
for n=1:3
tot = tot + T(m,n) .* vec_1(m) .* vec_2(n);
end
end 我想使用矢量化使它更快,所以我尝试了以下方法。 T = eye(3);
vec_1 = [4,5,6];
vec_2 = [7,8,9];
f = @(m,n) T(m,n) .* vec_1(m)
我正在计算(50500,)大小向量之间的巨大外积,发现NumPy是(多?)这样做比PyTorch更快。
以下是测试结果:
# NumPy
In [64]: a = np.arange(50500)
In [65]: b = a.copy()
In [67]: %timeit np.outer(a, b)
5.81 s ± 56.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
-------------
# PyTorch
In [73]: t1 = torch.arange(50500)
In [76]: t2
我需要分别得到张量每一行的外积。代码是这样的: input1=K.placeholder(shape=(None,12)) prod=K.map_fn(someMethod,input1) someMethod需要执行以下操作: *def someMethod(x):*
## get the outerproduct row-wise of input1 #
outer=x*x.T
## subtract the identity matrix from the outer product #
diff=outer-np.eye(12)
## and
我正在尝试做一些非常简单的事情,但是对Python中关于稀疏矩阵和向量的大量信息感到困惑。
我想创建两个向量,x和y,一个长度为5,另一个长度为6,是稀疏的。然后我想在每一个中设置一个坐标。然后我想创建一个矩阵A,sparse,它是5 x 6,然后加上x和y之间的外积,然后我想对这个矩阵A进行奇异值分解。
下面是我尝试过的方法,它在很多方面都出错了。
from scipy import sparse;
import numpy as np;
import scipy.sparse.linalg as ssl;
x = sparse.bsr_matrix(np.zeros(5));
x[1]
在MATLAB中,我让c是一个之前计算过的大型稀疏矩阵,并希望通过使用c列的外积来为单元数组D赋值。但是,我必须实现特殊的规则,并且不能获得相同c列的外积。
使用第一个for循环从第1列开始,我必须实现另一个for循环和if-else语句(当我在第二个for循环中增加索引时用于“标记”),以避免相同c列的外积。
最后,在嵌套的for循环之后,我想将所有的D相加得到一个矩阵K。这是我的第一个版本和背后的想法:
c = rand(100,100);
D = cell(1,100);
D{1} = eye(100);
for i = 1:100
flag = false;
我使用Python2.7、NumPy 1.6.2和SciPy 0.16.0来计算以下内容。
我已经创建了Hadamard矩阵。然后,我从矩阵的第0,2,4次向量创建了外积,并将它们相加,使对角线为0。然后,我使用SciPy.linalg.eigh()计算了特征值。它是退化的。前两个特征值相同,即-3。但是当我使用Python进行检查时,它显示它们并不相同。代码如下所示。
from scipy import linalg as sp
import numpy
from numpy import linalg as np
def get_outer_product(vector):
le
如何从一维阵列中最有效地计算二维外积的点积?
"i,j,k,l->ij,kl->“是一个很好的einsum选项,但这失败了。
invalid subscript ',' in einstein sum subscripts string, subscripts must be letters
下面是我试图加快的简单实现(A和B将是其他事情)。理想的方法是具有以下API的快速版本,其结果与以下示例相同: nd_outer_from1D(2,A,B),nd_outer_from1D(3,A,B)。正如您将看到的那样,随着{##**$$}}A++、B++和N增加,