条件括号的作用是基于一组条件来切换所要执行的等式。对于程序员来说,这其实就是简单的 if 语句。上面的条件等式可表示为:
i = 3
y = [-2, 3, 4, 1]
result = 0
if i in y:
result = sum(y)
elif i > 0:
result = 1
else:
result = 0
print(result) -> 6
可以看到,等式右侧括号中每一行都对应一个条件以及该条件下所要执行的路径。我还在每个条件中增加了额外的「属于」符号,以便提供更多见解。如前所示,我们检查了 i 值是否在 y 列表中。如果在,则返回数组的和。如果不在,我们则根据具体的值返回 0 和 1。逐点乘法和笛卡尔矩阵乘法最后,我想快速介绍几个任何数据科学家都可以用自己最喜欢的语言库轻松完成的运算——矩阵乘法。理解矩阵乘法的最简单方式是逐点运算。这可以简单地写成:
注意,首要要求是每个矩阵都必须形状一样(即 # rows= & #Columns=)。其代码如下:
y = [[2,1],[4,3]]
z = [[1,2],[3,4]]
x = [[0,0],[0,0]]
for i in range(len(y)):
for j in range(len(y[0])):
x[i][j] = y[i][j] * z[i][j]
print(x) -> [[2, 2], [12, 12]]
最后,我们来看一种典型的矩阵乘法过程,这在机器学习领域非常常用。用复杂的术语来说,这个运算的目的是求取每个主要行与每个次要列的点积。主要来说是下面的要求:假设 [#rows, #columns] → 矩阵 i x j 要求 #columns(i) == #rows(j) → 最终积的形状为 [#rows(i), #columns(j)]这看起来很令人困惑,我最好的建议是搜索一下这些要求的可视化图片。
这个等式的代码如下(使用了 numpy dot 方法):
y = [[1,2],[3,4]]
z = [[2], [1]]
# x has shape [2, 1]
x = [[0], [0]]
for i in range(len(y))
for j in range(len(z):
x[i][j] = np.dot(y[i], z[:, j])
print(x) -> [[4],
[10]]