假设我有两个矩阵: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)。然后我将元素乘以矩阵,并取每列的乘积。
在我写的实际程序中,M
和C
不一定是整数,可以是任何大小,并且这个计算执行了数千次。我想知道是否有人知道如何做到这一点快速和可读。
在我之前的解决方案中可以这样做:
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提供的解决方案,但无济于事。我非常想找出更优雅的东西!
答案 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)
行中元素的乘积。由于M
是M
个实例,因此结果的形状为(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()
:
*