Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 用nx1阵列计算nxn阵列阵列的点积_Python_Arrays_Numpy - Fatal编程技术网

Python 用nx1阵列计算nxn阵列阵列的点积

Python 用nx1阵列计算nxn阵列阵列的点积,python,arrays,numpy,Python,Arrays,Numpy,鉴于: 我想用A中的2x2阵列和B中的2x1阵列来计算两个阵列之间的点积,所以我想做的是: A = np.array([[[10, -1], [-1, 10]], [[30, 4], [5, 10]]]) B = np.array([[[5],[2]], [[3],[4]]]) 结果是: res = dot(A, B) 或者更容易: res = [[[48],[15]],[

鉴于:

我想用A中的2x2阵列和B中的2x1阵列来计算两个阵列之间的点积,所以我想做的是:

A = np.array([[[10, -1],
               [-1, 10]],
              [[30,  4],
               [5,  10]]])
B = np.array([[[5],[2]],
              [[3],[4]]])
结果是:

res = dot(A, B)
或者更容易:

res = [[[48],[15]],[[106],[55]]]
但我知道我的数组
A
相当长,因此
A.shape
mx2x2x2
,而我的数组
B
的长度总是相等的,即
B.shape
mx2x1
m
可以是任何值,例如
250000


我尝试了
np.tensordot
,但无法正确配置轴以获得我想要的结果。如何执行嵌套数组的点积?

使用
numpy有两种方法进行矩阵乘法:

1) 两个阵列的点积

res = [[48, 15], [106, 55]]
输出:

np.dot(A,B)
np.multiply(A,B)
2) 元素乘法(哈达玛乘积):

输出:

np.dot(A,B)
np.multiply(A,B)
matmul
@
设计用于对“批次”执行
dot
,如下所示:

In [60]: A = np.array([[[10, -1], 
    ...:                [-1, 10]], 
    ...:               [[30,  4], 
    ...:                [5,  10]]]) 
    ...: B = np.array([[[5],[2]], 
    ...:               [[3],[4]]])                                              
In [61]: A                                                                      
Out[61]: 
array([[[10, -1],
        [-1, 10]],

       [[30,  4],
        [ 5, 10]]])
In [62]: A.shape                                                                
Out[62]: (2, 2, 2)
In [63]: B.shape                                                                
Out[63]: (2, 2, 1)
einsum
也可以工作

In [64]: A@B                                                                    
Out[64]: 
array([[[ 48],
        [ 15]],

       [[106],
        [ 55]]])
np.dot
对未求和的维度执行外积:

In [65]: np.einsum('mij,mjl->mil',A,B)                                          
Out[65]: 
array([[[ 48],
        [ 15]],

       [[106],
        [ 55]]])
可以从对角线中提取所需的结果,但速度较慢,因为它实际上会丢弃一半的结果:

In [66]: np.dot(A,B).shape                                                      
Out[66]: (2, 2, 2, 1)

你能解释一下你是如何得到预期结果中的值的吗?我假设
48
10*5+(-1)*2
,但是
-25
是从哪里来的呢?对不起,我没有正确计算,它应该是15
(-1*5+2*10)
我想你可能只需要
A@B
(或者
np.matmul(A,B)
),也就是
[[48]、[15]、[106]、[55]
,但是
74
和另一个
-25
似乎也算错了。谢谢!这就正确地解决了问题。再次道歉,是的,这似乎是错误的,我理解,但我问的是嵌套在数组中的数组,如果你提到我最初的问题,我可以澄清,如果需要的话。
In [68]: np.dot(A,B)[range(2),:,range(2),:]                                     
Out[68]: 
array([[[ 48],
        [ 15]],

       [[106],
        [ 55]]])