添加二维数组和一维数组的数学解释是什么?
What is the mathematical explanation of adding 2d Array and 1d Array?
我似乎无法复制这个 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 等价物是什么?
你所做的很多事情确实模糊了你的观点,我认为,这与如何添加不同形状的数组有关。
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
我似乎无法复制这个 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 等价物是什么?
你所做的很多事情确实模糊了你的观点,我认为,这与如何添加不同形状的数组有关。
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