Скажем, у меня есть фрейм данных df
и столбец 'Array'
, который содержит набор numpy массивов. Теперь я хочу сохранить только те строки с формой массива, которые чаще всего существовали в этом столбце, и удалить другие строки. Я хочу вводить эти массивы как функции для выполнения некоторых задач машинного обучения, поэтому мне нужно убедиться, что они все в одной форме. Ниже мой сценарий, но он не работает. Я надеюсь, что ответ также должен работать, когда объекты являются матрицами.
import pandas as pd
df = pd.DataFrame(data)
lst = [i.shape for i in df['Array']]
most_common = max(set(lst), key=lst.count)
df = df[df['Array'].shape==most_common]
В основном я хочу преобразовать структуры Atomi c в числовые объекты, такие как numpy массивы или матрицы. Я использую метод под названием Кулоновская матрица для достижения этой цели. Если вы хотите попробовать себя, это весь мой сценарий:
import pandas as pd
from ase.db import connect
from ase import Atoms
from ase.io import read
import numpy as np
import numpy.linalg as linalg
def eig_data(atoms):
init_R = atoms.positions
init_Z = atoms.numbers
x_list = []
y_list = []
z_list = []
M_list = []
M_tmp = []
M_matrix = []
for x,y,z in init_R:
x_list.append(x)
y_list.append(y)
z_list.append(z)
order=0
for xl,yl,zl,Z in zip(x_list,y_list,z_list,init_Z):
M_list.append((order,xl,yl,zl,Z))
order+=1
for order,x,y,z,charge in M_list:
r = np.array((x,y,z))
M_tmp = []
for oorder,ox,oy,oz,ocharge in M_list:
if oorder == order:
IJ = 0.5*ocharge**2.4
M_tmp.append(IJ)
else:
otr = np.array((ox,oy,oz))
dist = np.linalg.norm(r-otr)
InJ = (charge*ocharge)/dist
M_tmp.append(InJ)
M_matrix.append(M_tmp)
M = np.array(M_matrix)
w,v = np.linalg.eig(M)
w_sort = np.sort(w)[::-1]
# print(np.amax(w_sort))
return w_sort
res = connect('c2db.db')
df = []
for row in res.select():
atoms = row.toatoms()
i = row.id
c = eig_data(atoms)
f = row.formula
E = row.energy
g = row.gap
w = row.workfunction
df.append({'id': i, 'c_matrix':c, 'formula':f, 'energy': E, 'band_gap':g, 'work_function':w})
df = pd.DataFrame(df)
lst = [i.shape for i in df['c_matrix']]
most_common = max(set(lst), key=lst.count)
df = df[df['c_matrix'].shape==most_common]
База данных может быть загружена здесь: c2db_database