【20211115】【Python】Python中列表、矩阵元素相乘及矩阵乘法

1. 列表元素相乘

        使用 * 或者 np.multiply() 可实现对应元素相乘

import numpy as np

a = [2, 2, 2, 2, 5]
b = 2

print(np.multiply(a, b))
print(np.multiply(a, a))
print(np.array(a)*np.array(a))
print(a*a)  # 会报错!因为 * 实现对应元素相乘,只适用于 np.array 类型

【20211115】【Python】Python中列表、矩阵元素相乘及矩阵乘法_第1张图片

2. 矩阵元素相乘

        使用 np.multiply() 可实现对应矩阵对应元素相乘

import numpy as np

b = [[1, 2, 3, 4, 5],
     [3, 2, 1, 0, 5]]
c = [[1, 1, 1, 1, 2],
     [2, 2, 2, 2, 0]]

print(np.multiply(b, c))
print(np.array(b)*np.array(c))

【20211115】【Python】Python中列表、矩阵元素相乘及矩阵乘法_第2张图片

3. 矩阵乘法

        使用 .dot 实现矩阵乘法!(要注意行数和列数之间的的对应!)

import numpy as np

b = [[1, 2, 3],
     [3, 2, 1]]  # 2*3
c = [[1, 1],
     [2, 2],
     [3, 3]]  # 3*2

print(np.dot(b, c))

【20211115】【Python】Python中列表、矩阵元素相乘及矩阵乘法_第3张图片

        (参考:Python中乘法)

        (参考:Python 实现两个列表里元素对应相乘的方法)

        (参考:Python中的几种矩阵乘法(转))


补充工作中踩的坑:

        根据多元高斯模型的概率公式计算概率密度时,涉及到矩阵的点乘,在 Python 中我使用了 *。明显地,矩阵的行数/列数没有对应上,但Python 没有报错。

        经排查,是因为计算的是元素乘法而不是矩阵点乘。改成 np.dot() 之后,计算正确!

# 计算每个样本的多元高斯分布的 pdf
N = dataset.values.shape[1]
a = (2 * math.pi) ** (N / 2)
b = (np.linalg.det(Sigma)) ** (1/2)
c = np.linalg.inv(Sigma)
tmp = dataset.values
pdf = []
for x in tmp:
    aa = 1 / (a * b)
    bb = np.dot(x - mu, c)    # 这才是矩阵点乘!!!
    cc = np.dot(bb, (x - mu).T)   # 这才是矩阵点乘!!!
    dd = aa * math.exp(-1/2 * cc)
    # bb = -1 / 2 * (x - mu) * c * (x - mu).T   # 这不是矩阵乘法!!!
    pdf.append(dd)

你可能感兴趣的:(Python,python,矩阵,线性代数)