L'histoire du rubyiste aux prises avec Python :: Dict data with pycall
Version PyCall Ruby Tips a un rapport de correspondance presque parfait. De plus, la notation spécifique à numpy
{.example}
#Accès à la dernière ligne m avec python[-1,:]Où écrire
Et ainsi de suite, rubyist a même une explication facile à comprendre de numpy.
Il semble que cela puisse être fait facilement. .. ..
Cependant, lorsqu'il s'agit de structures de données python complexes C'est très difficile. La cause est que je ne connais pas la clé de dict. C'est bien quand vous prenez des personnages simples, mais cela ne semble pas bien fonctionner avec des personnages légèrement compliqués.
Vasprun :: tdos ou dans pymatgen comme suit Vasprun :: compolete \ _dos etc. peut être pris.
cependant,
Si 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>}
Est sortie. Je pense que cela peut être pris avec spd \ _dos ('OrbitalType.s') Pas bien. Donc,
p s_d = spd_dos.to_a[0][1].densities
Comme
{.example}
array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
...
])
Faites-le python :: array puis
s_list = PyCall::List.(s_d.to_a[0][1]).to_a
Comme, hash est défini sur array, vals est retiré et il est converti en une structure de données que ruby peut interpréter avec en \ _a.
Une fois que vous vous y serez habitué, vous n'aurez pas beaucoup de problèmes car le même code est répété, Peut-être que je l'oublierai avec le temps. Je veux que vous l'incorporiez dans lib, mais il semble que seuls les caractères lisent directement dict. .. .. Souhaitez-vous écrire un code et essayer pull req?
Si vous ne connaissez pas le nom des densités et de l'énergie, vous ne pouvez pas vous en empêcher. Cela peut être trouvé en lisant le code source de pymatgen. Apparemment, pour utiliser pycall, vous devez répéter cela.
{.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