添加二维数组和一维数组的数学解释是什么?



我似乎无法复制这种 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)

在朱莉娅,我会写

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 等价物是什么?

你正在做很多真正模糊你的观点的事情,我相信,这与如何添加不同形状的数组有关。

蟒:

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

相关内容

  • 没有找到相关文章

最新更新