Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组操作中的Python错误_Python_Arrays_Numpy - Fatal编程技术网

数组操作中的Python错误

数组操作中的Python错误,python,arrays,numpy,Python,Arrays,Numpy,我有两个数组(为了这个例子,让我们把它们命名为A和B),我对它们执行了以下操作,但在代码中赋值“d2”时出错 n = len(tracks) #tracks is a list containing different-length 3d arrays n=30; #test with a few tracks length = len(tracks) #list containing the total number of "samples" perm_index = np.random.

我有两个数组(为了这个例子,让我们把它们命名为A和B),我对它们执行了以下操作,但在代码中赋值“d2”时出错

n = len(tracks) #tracks is a list containing different-length 3d arrays 
n=30; #test with a few tracks 
length = len(tracks) #list containing the total number of "samples"
perm_index = np.random.permutation(length) #uniform sampling without replacement
subset_len = 5 # choose the size of subset of tracks A
subset_A = [tracks[x:x+1] for x in xrange(0, subset_len, 1)]
subset_B = [tracks[x:x+1] for x in xrange(subset_len, n, 1)]
tempA = distance_calc.dist_calcsub(len(subset_A), subset_A)  # distance matrix calculation
tempA = mcp.sym_mcp(len(subset_A), tempA)    # symmetrize mcp ???
tempB = distance_calc.dist_calcsubs(subset_A, subset_B)  # distance matrix calculation
#symmetrize mcp ? ? its not diagonal, symmetric . . .

A = affinity.aff_conv(60, tempA) # conversion to affinity 
B = affinity.aff_conv(60, tempB) # conversion to affinity 

#((row,col)) = np.shape(A)
#A = normalization_affinity.norm_aff(row, col, A) # normalization of affinity matrix

# Normalize A and B for Laplacian using row sums of W, where W = [A B; B' B'*A^-1*B].
# Let d1 = [A B]*1, d2 = [B' B'*A^-1*B]*1, dhat = sqrt(1./[d1; d2]).
d1 = np.sum( np.vstack((A, np.transpose(B))) )
d2 = np.sum(B,0) + np.dot(np.sum(np.transpose(B),0), np.dot(np.linalg.pinv(A), B ))
dhat = np.transpose(np.sqrt( 1/ np.hstack((d1, d2)) ))
A = A* np.dot( dhat[0:subset_len], np.transpose(dhat[0:subset_len]) )
B = B* np.dot( dhat[0:subset_len], np.transpose(dhat[subset_len:n]) )
错误再次是“ValueError:矩阵未对齐”,因为np.dot向量是不同大小的1d向量;我知道发生这种情况的原因,但我完全按照方程来执行Nystrom方法


附言:我遵循本论文第90-92页所述的方法:

看这篇论文,这里有两个问题

让我们从你问题中遗漏的信息开始。您正在尝试执行此操作:

bc + B.T * A^−1 * br
其中,
ar
br
是列向量,包含
A
B
bc
的行和
B
的列和

特别是,您正在将
A^-1*br
映射到
np.dot(np.linalg.pinv(A),np.sum(B,0))


第一个问题是,
np.linalg.pinv
是伪逆A+,而不是乘法逆A^-1。使用完全不同的操作,仅仅因为它不会给你一个错误,并不能解决问题

那么,如何计算乘法逆呢?嗯,你不能。一般来说,对于非平方矩阵,乘法逆不存在,因此给定5x10
a
,您将被困在最开始的位置


无论如何,第二个问题来自这样一个事实:您的
br
不是列向量。如果你想用矩阵的方式思考,就像这篇文章一样,它是一个行向量,10x1而不是1x10。如果你想用numpy ndarray术语来思考,它是一个1D
(10,)
数组,而不是2D
(1,10)
数组。如果你用矩阵乘法的术语来考虑运算,你就不能用10x1矩阵乘以10x5矩阵;如果用NumPy术语将其视为多维点积,则不能将
(10,5)
数组与
(10,5)
数组相乘

的确,您可以将点积扩展到MxN矩阵与M向量的特定域,在该定义下,您的乘法是有意义的。但这不是本文的标准矩阵乘法符号或NumPy的
dot
函数所使用的定义。那么,你能做什么?请注意,您尝试执行的操作是可交换的,因此交换操作数的顺序是完全合法的,如果您这样做,那么它正好对应于一般的点积。所以,你可以把它写成
np.dot(np.sum(B,0),np.linalg.pinv(A))
并得到你想要的结果。还有许多其他方法可以变换矩阵与向量乘法域中的幂等矩阵,但对于
np.dot
,它们都会得到相同的结果。例如,
np.dot(np.linalg.pinv(A.T,np.sum(B,0))
也可以工作

我也不知道你为什么要用dot产品。我看不出符号中有任何暗示

但所有这一切都只是一场杂耍;如果正确地反转
A
,则会得到与
A
尺寸相同的东西,并将5x10矩阵与10x1向量相乘,或将
(5,10)
数组与
(10,)
数组相乘,这已经得到了很好的定义。唯一的问题是,同样的,你不能对非平方矩阵进行逆变换,所以你根本不可能到达这个地方


因此,真正的解决方案是回到您决定的
A
B
的形状,然后重试

特别是,从论文中的插图中可以非常清楚地看出,
A
B
从更大的矩阵推导而来,
A
的高度是
B
的高度,
A
的宽度是
B.T
的宽度,这当然也是
B
的高度

此外,如果假设较大的矩阵是对称的,并且
A
是对称矩阵的左上角,
A
必须是对称的

我还认为您已经多次混淆了行-列顺序和x-y顺序,
bc
应该是
B
的列和,而不是
B.T
的列和(它只是
B
的行和,被转换为行向量而不是列向量)

当我们这样做的时候,让我们尽可能地使用方法和操作符,而不是用尽可能长的方式编写所有内容

所以,我想你想要的是这样的:

A = np.random.random_sample((4, 4)) # square
A = (A + A.T) / 2 # and symmetric
B = np.random.random_sample((4, 10))
ar = A.sum(1)
br = B.sum(1)
bc = B.sum(0) # not B.T.sum(0), that's just br again!
d1 = ar + br
d2 = bc + np.dot(B.T, np.dot(np.linalg.inv(A), br))

在没有真正阅读这篇论文的情况下,我无法确定这是否是你真正想要的,但这看起来很适合快速浏览这两页,而且运行时没有任何错误,所以希望你至少可以看看结果,看看它们是否是你想要的。

你对B的第一维求和,因此形状是10,B的第二维度的大小

你可以计算

np.dot( np.sum(B, 0), np.linalg.pinv(A))

但是这给了你一个有5个元素的向量,但是B_T的大小只有4。所以有些东西不适合您的样本数据。

您希望
np.sum(B,0)
具有什么形状?将每行求和为一个值,得到10个值。你想要一个10x4的矩阵,每行用4份行的总和来代替吗?我希望在任何情况下都能得到B的行总和;A和B仅用于图示目的。在这种情况下,我得到的正是我所期望得到的。你真的需要从链接的论文中总结相关信息,这样问题本身就有意义了。问题是方程没有提到我应该转置inv(A),但我应该这样使用它。我的意思是,我可以用一些技巧来完成工作,但理论上不是这样的s@GeorgeLaza例如我不知道什么方程式