NumPy点积:获取矢量积的乘积(而非总和)

时间:2016-01-08 03:14:00

标签: python numpy matrix matrix-multiplication

假设我有两个矩阵:M为2x3,C为3x4 ...

import numpy as np
M = np.matrix([ [1,2,3], [4,5,6]])
C = np.matrix([ [1,1,2,2], [1,2,1,2], [2,1,1,1]])

我需要将这些矩阵相乘以得到大小为2x4的结果。使用np.dot(M, C)这很容易,但我希望将矢量乘积乘以而不是求和。

例如,常规点积可以:

result[0,0] = (M[0,0]*C[0,0]) + (M[0,1]*C[1,0]) + (M[0,2]*C[2,0])
# result[0,0] = (1*1) + (2*1) + (3*2)
# result[0,0] = 9

我只想用加号替换加号......

result[0,0] = (M[0,0]*C[0,0]) * (M[0,1]*C[1,0]) * (M[0,2]*C[2,0])
# result[0,0] = (1*1) * (2*1) * (3*2)
# result[0,0] = 12

我最好的解决方案依赖于循环M -

result = np.empty( (2,4) )
for i in range(2):
    result[i,:] = np.prod(np.multiply(np.tile(M[i,:].T , (1,4)), C) , axis=0)

打破这一点,M的每一行都被转置,然后平铺(使用np.tile),因此它与C的大小相同(即3x4)。然后我将元素乘以矩阵,并取每列的乘积。

在我写的实际程序中,MC不一定是整数,可以是任何大小,并且这个计算执行了数千次。我想知道是否有人知道如何做到这一点快速和可读。

更新

@Warren Weckesser提供了一个很好的解决方案。但是现在我遇到了一个新的挑战 - 具体来说,如果我想在乘法之前从矢量产品中减去一个数字呢?

在我之前的解决方案中可以这样做:

result1 = np.empty( (2,4) ) 
for i in range(2): 
    result1[i,:] = np.prod( 1 - np.multiply( np.tile(M[i,:].T , (1,4)), C) , axis=0)

我已经玩过@Warren Weckesser提供的解决方案,但无济于事。我非常想找出更优雅的东西!

1 个答案:

答案 0 :(得分:2)

这是一个快速的方法:

!/usr/bin/python

import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject 
from gi.repository import Gst as gst

GObject.threads_init()
gst.init(None)

if __name__ == "__main__":
    # First create our pipeline

    # filesrc ! mad ! audioconvert ! audioresample          pipe = 
    gst.Pipeline("mypipe")

    # Create the file source 1
    filesrc1 = gst.ElementFactory.make("filesrc","filesrc1")
    filesrc1.set_property('location', "test1.mp3")
    pipe.add(filesrc1)

    mad_convert1 = gst.ElementFactory.make("mad","mad_convert1")             
    pipe.add(mad_convert1)
    filesrc1.link(mad_convert1)

    audio_convert1 = gst.ElementFactory.make("audioconvert","audio_convert1")
    pipe.add(audio_convert1)
    mad_convert1.link(audio_convert1)

    audio_resample1 = gst.ElementFactory.make("audioresample","audio_resample1")
    pipe.add(audio_resample1)
    audio_convert1.link(audio_resample1)

    # Create the file source 2
    filesrc2 = gst.ElementFactory.make("filesrc","filesrc2")
    filesrc2.set_property('location', "test2.mp3")
    pipe.add(filesrc2)

    mad_convert2 = gst.ElementFactory.make("mad","mad_convert2")
    pipe.add(mad_convert2);
    filesrc2.link(mad_convert2)

    audio_convert2 = gst.ElementFactory.make("audioconvert","audio_convert2")
    pipe.add(audio_convert2)
    mad_convert2.link(audio_convert2)

    audio_resample2 = gst.ElementFactory.make("audioresample","audio_resample2")
    pipe.add(audio_resample2)
    audio_convert2.link(audio_resample2)

    # Create a software mixer with "Adder"
    adder = gst.ElementFactory.make("audiomixer","audiomixer")
    pipe.add(adder)

    # Gather a request sink pad on the mixer
    sinkpad1=adder.get_request_pad("sink_%u")

    # Get an another request sink pad on the mixer
    sinkpad2=adder.get_request_pad("sink_%u")

    # .. and connect it's source pad to the previously gathered request pad
    audio_resample1_src=audio_resample1.get_static_pad("src")
    audio_resample1_src.link(sinkpad1)

    audio_resample2_src = audio_resample2.get_static_pad("src")
    audio_resample2_src.link(sinkpad2)

    # Add some output

    audio_convert_out =   gst.ElementFactory.make("audioconvert","audio_convert_out")
    pipe.add(audio_convert_out)

    output = gst.ElementFactory.make("filesink", "audio_out")
    output.set_property('location', "test_out.mp3")
    pipe.add(output)

In [68]: M Out[68]: matrix([[1, 2, 3], [4, 5, 6]]) In [69]: C Out[69]: matrix([[1, 1, 2, 2], [1, 2, 1, 2], [2, 1, 1, 1]]) In [70]: M.prod(axis=1) * C.prod(axis=0) Out[70]: matrix([[ 12, 12, 12, 24], [240, 240, 240, 480]]) M.prod(axis=1)行中元素的乘积。由于MM个实例,因此结果的形状为(2,1):

matrix

同样,In [71]: M.prod(axis=1) Out[71]: matrix([[ 6], [120]]) C.prod(axis=0)

列中的产品
C

然后这两个矩阵的矩阵乘积,形状(2,1)和(1,4),形状(2,4),它包含你想要的产品。

使用数组时,使用In [72]: C.prod(axis=0) Out[72]: matrix([[2, 2, 2, 4]]) keepdims参数来维护2D形状,并使用prod()方法代替dot()

*