标量-向量乘法与向量-矩阵乘法有什么区别?

3

你是否有使用Python(NumPy)功能可以完成第三个“方程”?

将其用作返回的lambda函数。

1. 向量*标量

vector*scalar

import numpy as np
a = np.array([3,4])
b = 2
print(a*b)
>>[6,8]

或者作为lambda函数:
import numpy as np

def multiply():
  return lambda a,b: a*b

a = np.array([3,4])
b = 2
j = multiply()
print(j(a,b))
>>[6,8]

2. 矩阵 * 向量

matrix*vector

import numpy as np
a = np.array([[3,4],[2,5]])
b = np.array([2,4])
print(a*b)
print()
print(np.multiply(a,b))
print()
print(a.dot(b))
print()
print(b.dot(a))
>>[[ 6 16]
>>[ 4 20]]
>>
>>[[ 6 16]
>>[ 4 20]]
>>
>>[22 24]
>>
>>[14 28]

或者作为 lambda 函数:
import numpy as np

def multiply():
  return lambda a,b: a.dot(b)

a = np.array([[3,4],[2,5]])
b = np.array([2,4])
j = multiply()
print(j(a,b))
>>[22 24]

3. 矩阵(解释为许多(2,1)向量)*向量(解释为许多标量)或:对于每行进行向量*标量的运算

matrix(many vectors)*vector(many scalars)

import numpy as np
a = np.array([[3,4],[2,5]])
b = np.array([2,4])

see answer by ALI

或作为 lambda 函数:

import numpy as np

def multiply():
  return lambda a,b: ???

a = np.array([[3,4],[2,5]])
b = np.array([2,4])
j = multiply()
print(j(a,b))
>>[[6,8],
>>[8,20]]

Lambda函数有什么用?它们与这个问题完全无关... - Nils Werner
似乎将问题分成两个独立的Stackoverflow帖子是不必要的(第一个是如何做,第二个是如何作为lambda函数执行)。我有一个更复杂的lambda函数,这是我苦苦挣扎的部分,我省略了其他的东西,因为它们对于这个部分来说并不重要,会使这个问题变得更加复杂。 - Chris F
相反地:鼓励发布 MCVE。将这些问题分开可以更容易地理解和单独回答它们。 - Nils Werner
2个回答

1
import numpy as np
a = np.array([[3,2], [4, 5]])
b = np.array([2, 4])
c = np.vstack((b, b)).T
d = np.multiply(a,c)
print(d)


array([[ 6,  8],
       [8, 20]])

如果您需要一个函数:
def elementwisemult(a, b):
    b = np.vstack((b, b)).T
    d = np.multiply(a,b)
    return d

如果您想使用lambda函数:

import numpy as np
a = np.array([[3,4],[2,5]])
b = np.array([2,4])
def elementwisemult():
    return lambda a, b: np.multiply(a, (np.vstack((b, b)).T))
j = elementwisemult()
j(a,b)

如何将此重写为 Lambda 函数?(请参见我的编辑帖子,了解 1 和 2。) - Chris F
将数据堆叠在乘法之前是一种不必要的复杂化和浪费内存的做法。你应该使用广播代替。 - Nils Werner

0

使用

import numpy as np

a = np.array([
    [3, 4],
    [2, 5],
])
b = np.array([2, 4])

使用标量积的方程式1

b * 3
# array([ 6, 12])

使用点积的方程式2

np.dot(a, b)
# array([22, 24])

使用广播逐元素乘积的方程式3

a * b[:, None]
# array([[ 6,  8],
#        [ 8, 20]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接