如何使Julia输出向量与Numpy一样漂亮?

omqzjyyz  于 2023-02-12  发布在  其他
关注(0)|答案(3)|浏览(96)

如果我执行以下操作:

A = [
  2   1   3   0   0;
  1   1   2   0   0;
  0   6   0   2   1;
  6   0   0   1   1;
  0   0 -20   3   2
]
b = [10; 8; 0; 0; 0]
println(A\b)

输出为:

[8.000000000000002, 12.0, -6.000000000000001, -23.999999999999975, -24.000000000000043]

但是,我希望它看起来类似于Numpy输出同一问题结果的方式(编辑:但优选地保持尾随零和逗号):

[  8.  12.  -6. -24. -24.]

有简单的方法吗?我当然可以写自己的函数来做这件事,但是如果我能设置一些格式化标志就太好了。
谢谢!

7lrncoxx

7lrncoxx1#

标准方法是更改IOContext

julia> println(IOContext(stdout, :compact=>true), A\b)
[8.0, 12.0, -6.0, -24.0, -24.0]

你可以写你的函数,例如(我不想在这里完全通用,而是向你展示的想法):

printlnc(x) = println(IOContext(stdout, :compact=>true), x)

然后在代码中调用prinlnc

q8l4jmvw

q8l4jmvw2#

您可以通过覆盖浮点数的Base.show方法来更改Julia中的REPL行为。

Base.show(io::IO, f::Float64) = print(io, rstrip(string(round(f, digits=7)),'0') )

现在您有:

julia> println(A\b)
[8., 12., -6., -24., -24.]

正如@DNF所指出的,Julia在向量中使用逗号。如果你想得到一个水平向量(实际上是一个1xn矩阵),你需要转置:

julia> (A\b)'
1×5 adjoint(::Vector{Float64}) with eltype Float64:
 8.  12.  -6.  -24.  -24.

julia> println((A\b)')
[8. 12. -6. -24. -24.]
yhxst69z

yhxst69z3#

Numpy对你撒谎了。它只是在打印时隐藏数字。要检查它只操纵输出的打印,请执行print(A @ X - b)并查看结果。

print(A @ X - b)
[ 0.00000000e+00  0.00000000e+00  0.00000000e+00 -3.55271368e-15  0.00000000e+00]

另一方面,Julia在前面就明确了这一点,如果你在Julia中做同样的事情,你会得到同样的结果(我和Numpy一样使用Foat64):

julia> X = A \ b;

julia> Float64.(A) * X - b
5-element Vector{Float64}:
  0.0
  0.0
  0.0
 -3.552713678800501e-15
  0.0

但是,您可以使用类似于数组的紧凑打印来删除不必要的数字。

julia> round.(X, digits=7)
5-element Vector{Float64}:
   8.0
  12.0
  -6.0
 -24.0
 -24.0

这,比“丑陋”的8. 12. -6. -24. -24.好多了

相关问题