如何在Julia中创建ones数组



在许多机器学习用例中,您需要创建一个包含1的数组,该数组具有特定的维度。在Python中,我会使用np.ones((2, 1))。Julia的模拟版本是什么?

Julia有一个内置的ones函数,可以如下使用:

julia> ones(1,2)
1×2 Matrix{Float64}:
1.0  1.0

您可以在Julia文档中阅读更多关于ones函数的信息。

Logan的回答非常好。你可以使用ones函数。

但是,你也可以经常不使用它。

例如,一个向量为一的常用方法是将该向量乘以另一个向量,这样你就得到了一个矩阵,其中每一行的值与矩阵中相应元素的值相同。然后你可以把这个矩阵加到某个东西上。这允许您将向量的值添加到矩阵的相应行中。你会得到这样的代码:

>>> A = np.random.rand(4,3)
>>> x = np.random.rand(4)
array([0.01250529, 0.9620139 , 0.70991563, 0.99795451])
>>> A + np.reshape(np.ones(3), (1,3)) * np.reshape(x, (4,1)) 
array([[0.09141967, 0.83982525, 0.16960596],
[1.39104681, 1.10755182, 1.60876696],
[1.14249757, 1.68167344, 1.64738165],
[1.10653393, 1.45162139, 1.23878815]])

事实上,这对计算机来说是一大堆额外的工作,因为Python无法优化这一点,而且还有很多额外的工作正在进行。你也可以使用所谓的广播来更简单地进行扩展,但你仍然必须将x变成正确的形状:

>>> A + x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (4,3) (4,) 
>>> A + np.reshape(x, (4,1))
array([[0.09141967, 0.83982525, 0.16960596],
[1.39104681, 1.10755182, 1.60876696],
[1.14249757, 1.68167344, 1.64738165],
[1.10653393, 1.45162139, 1.23878815]])

在Julia中,可以更简单地使用广播运算符将向量扩展为与要添加的矩阵相同的形状。因此,上面的代码简化为

julia> A = rand(4,3)
4×3 Matrix{Float64}:
0.885593  0.494999  0.534039
0.915725  0.479218  0.229797
0.739122  0.670486  0.247376
0.419879  0.857314  0.652547
julia> x = rand(4)
4-element Vector{Float64}:
0.9574839624590326
0.9736140903654276
0.6051487944513263
0.3581090323172089
julia> A .+ x
4×3 Matrix{Float64}:
1.84308   1.45248  1.49152
1.88934   1.45283  1.20341
1.34427   1.27563  0.852524
0.777988  1.21542  1.01066

这样做效果更好的一个原因是语法中的噪声较少,因为数组对Julia来说是原始的。

然而,更重要的是,编译器看到了广播运算符的使用,它可以生成非常高效的代码(甚至可以将其向量化(。事实上,x甚至不必是一个实际的向量,只要它有一些相同的方法定义

事实上,如果你真的需要一个全1的向量或矩阵(或其他一些常数(,你可以使用带有标量的广播以及

julia> A .+ 1
4×3 Matrix{Float64}:
1.88559  1.495    1.53404
1.91572  1.47922  1.2298
1.73912  1.67049  1.24738
1.41988  1.85731  1.65255

最新更新