Die Geschichte eines Rubinisten, der mit Python :: Dict-Daten mit Pycall kämpft
PyCall Ruby-Version Tipps hat einen nahezu perfekten Korrespondenzbericht. Zusätzlich numpy-spezifische Notation
{.example}
#Zugriff auf die letzte Zeile m mit Python[-1,:]Wo man schreibt
Und so weiter hat Rubyist sogar eine leicht verständliche Erklärung für Numpy.
Es sieht so aus, als ob es einfach geht. .. ..
Beim Umgang mit komplexen Python-Datenstrukturen Es ist sehr schwierig. Die Ursache ist, dass ich den Schlüssel des Diktats nicht kenne. Es ist gut, wenn Sie einfache Zeichen nehmen, aber es scheint nicht gut mit leicht komplizierten Zeichen zu funktionieren.
Vasprun :: tdos oder in pymatgen wie folgt Vasprun :: compolete \ _dos etc. können genommen werden.
Jedoch,
Wenn p spd \ _dos = dosrun.complete \ _dos.get \ _spd \ _dos ()
{<OrbitalType.s: 0>: <pymatgen.electronic_structure.dos.Dos object at 0x102dd4710>, <OrbitalType.p: 1>: <pymatgen.electronic_structure.dos.Dos object at 0x102dc2dd8>, <OrbitalType.d: 2>: <pymatgen.electronic_structure.dos.Dos object at 0x102d962b0>}
Wird ausgegeben. Ich denke, das kann mit spd \ _dos ('OrbitalType.s') gemacht werden. Nicht gut. Deshalb,
p s_d = spd_dos.to_a[0][1].densities
Wie
{.example}
array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
...
])
Machen Sie es python :: array und dann
s_list = PyCall::List.(s_d.to_a[0][1]).to_a
Da Hash auf Array gesetzt ist, wird vals herausgenommen und in eine Datenstruktur konvertiert, die Ruby mit \ _a interpretieren kann.
Sobald Sie sich daran gewöhnt haben, werden Sie keine großen Probleme mehr haben, da der gleiche Code wiederholt wird. Vielleicht werde ich es mit der Zeit vergessen. Ich möchte, dass Sie es in lib integrieren, aber es scheint, dass nur Zeichen Diktat direkt lesen. .. .. Möchten Sie einen Code schreiben und versuchen, req zu ziehen?
Wenn Sie den Namen der Dichte und Energie nicht kennen, können Sie nichts dagegen tun. Dies kann durch Lesen des Quellcodes von Pymatgen gefunden werden. Anscheinend müssen Sie dies wiederholen, um Pycall zu verwenden.
{.ruby}
require 'pycall/import'
include PyCall::Import
pyimport :sys
pyimport 'numpy', as: :np
pyfrom 'pymatgen.io.vasp.outputs', import: :Vasprun
# dos
dosrun = Vasprun.("../dos_calc_fine/vasprun.xml")
e_object = (dosrun.tdos.energies - dosrun.efermi)
energy = PyCall::List.(e_object).to_a
spd_dos = dosrun.complete_dos.get_spd_dos()
spd = PyCall::Dict.(spd_dos)
s_d = spd.to_a[0][1].densities
s_list = PyCall::List.(s_d.to_a[0][1]).to_a
p_d = spd.to_a[1][1].densities
p_list = PyCall::List.(p_d.to_a[0][1]).to_a
d_d = spd.to_a[2][1].densities
d_list = PyCall::List.(d_d.to_a[0][1]).to_a
tdos = dosrun.tdos.densities
t_list = PyCall::List.(tdos.to_a[0][1]).to_a
require 'numo/gnuplot'
Numo.gnuplot do
set yrange: '[-10:10]'
plot [s_list, energy, w: :l, title: 's'],
[p_list, energy, w: :l, title: 'p'],
[d_list, energy, w: :l, title: 'd'],
[t_list, energy, w: :l, title: 'total']
end
Recommended Posts