【问题标题】:What is the mathematical explanation of adding 2d Array and 1d Array?添加 2d Array 和 1d Array 的数学解释是什么?
【发布时间】:2020-05-10 02:17:36
【问题描述】:

我似乎无法复制这个 numpy 算法。我正在使用 Julia,但想知道这段代码的数学解释。它似乎打破了我对线性代数的了解。

X = np.arange(-5, 5, 0.2).reshape(-1, 1)

X.shape  ## (50, 1)

test = np.sum(X**2, 1).reshape(-1, 1) + np.sum(X**2, 1)

test.shape  ## (50, 50)

在 Julia 中,我会写

X = reshape(collect(range(-5, stop=5, length=N)), :, 1);

size(X)  ## (50, 1)

test = sum(X.^2, dims=2) + vec(sum(X.^2, dims=2));

size(test) ## (50, 1)

我试图思考一个 50x50 矩阵将如何成为添加两个向量的结果?我知道 numpy 在后台使用了很多广播,但我似乎不清楚这是做什么的。

numpy 在这里所做的事情的数学符号或 Julia 等价物是什么?

【问题讨论】:

  • numpy broadcasts。如果您不希望发生这种情况,请不要添加大小为 1 的悬空维度
  • 另外,求和然后再整形根本不会改变数据,所以你为什么要这样做令人困惑。
  • 我也觉得很困惑。我正在关注此处找到的 GP 教程:katbailey.github.io/post/gaussian-processes-for-dummies 我想在 Julia 中重新创建它,但同时也试图理解数学。
  • 结构过于复杂。只需写X = range(-5, 5, length=N)。不需要collectreshape

标签: arrays numpy matrix julia linear-algebra


【解决方案1】:

您所做的很多事情确实掩盖了您的观点,我相信这与如何添加不同形状的数组有关。

Python:

In [21]: x = np.random.rand(5, 1)                                               

In [22]: x.shape                                                                
Out[22]: (5, 1)

In [23]: y = np.random.rand(1, 4)                                               

In [24]: y.shape                                                                
Out[24]: (1, 4)

In [25]: (x + y).shape                                                          
Out[25]: (5, 4)

朱莉娅:

julia> x = rand(5);

julia> y = rand(1, 4);

julia> x + y
ERROR: DimensionMismatch("dimensions must match")

julia> x .+ y
5×4 Array{Float64,2}:
 1.95779  1.31897   1.23345   1.32423 
 1.78126  1.14244   1.05692   1.14771 
 1.08306  0.444243  0.35872   0.449509
 1.69756  1.05874   0.97322   1.06401 
 1.18661  0.547789  0.462265  0.553054

julia> size(x .+ y)
(5, 4)

如您所知,Python 默认广播数组,而 Julia 要求您通过点运算符 . 专门请求它。

正是因为添加两个不同形状的数组没有意义,所以 Julia 默认不广播。同样,对于乘法,*.* 不同:

julia> A = [1 2; 3 4]
2×2 Array{Int64,2}:
 1  2
 3  4

julia> B = [4 5; 6 7]
2×2 Array{Int64,2}:
 4  5
 6  7

julia> A * B
2×2 Array{Int64,2}:
 16  19
 36  43

julia> A .* B
2×2 Array{Int64,2}:
  4  10
 18  28

普通的*是矩阵乘法,后者是元素数组乘法。

另一个例子:

julia> A = [1 2 3; 4 5 6]
2×3 Array{Int64,2}:
 1  2  3
 4  5  6

julia> b = [7, 8]
2-element Array{Int64,1}:
 7
 8

julia> A * b
ERROR: DimensionMismatch("matrix A has dimensions (2,3), vector B has length 2")

julia> A .* b
2×3 Array{Int64,2}:
  7  14  21
 32  40  48

【讨论】:

  • 我更喜欢 Julia 的语法。我想知道在 numpy 中发生了什么的唯一方法是事先知道数组的形状。我喜欢 Julia 要求我们具体化,所以当我们“打破”规则时很明显。
猜你喜欢
  • 2020-12-11
  • 2021-05-05
  • 2021-11-01
  • 2018-08-25
  • 2016-04-25
  • 1970-01-01
  • 2021-07-28
  • 2018-12-23
  • 2023-03-26
相关资源
最近更新 更多