请问python类中建立的矩阵怎么初始化?
本帖最后由 lqhenwunai 于 2020-8-8 11:25 编辑比如我有这么一段代码:
class molecule:
XYZ_Coords=np.mat(np.zeros((3,3)))
Atoms=[]
def __init__(self, ?????):
请问对于这样的类,我怎么写init函数进行实例化呢?
在之后的函数调用中,我有这么一段代码:
Molecules=[]
H2O=molecule()
for i in range(NAtom):
H2O.Atoms.append(Atoms)
H2O.XYZ_Coords=GeomBlock
H2O.XYZ_Coords=GeomBlock
H2O.XYZ_Coords=GeomBlock
j+=1
if (i+1)%3==0:
Molecules.append(H2O)
j=0
我是想建立一个水分子的对象,每个水分子由三个原子组成。因此在读取每个原子的坐标后,以三个为一组,存到水分子这个对象中,然后将所有水分子对象存到Molecules这个列表中。
但是最后打印出的Molecules.XYZ_Coords,都显示的是最后一个水分子的坐标。因此我觉得是我的molecule这个类没有定义init的缘故。但是我这种情况应该怎么定义init函数呢?
谢谢。 class molecule:
def __init__(self):
self.XYZ_Coords = np.mat(np.zeros((3,3)))
self.Atoms = [] 麻烦给个最佳啊{:10_266:} 永恒的蓝色梦想 发表于 2020-8-8 11:35
谢谢!我把 XYZ_Coords 和Atoms都放到init里定义,然后有以下调用:
Molecules=[]
H2O=molecule()
NMol=300
NAtom=len(Atoms)
H_x_avg=0
H_y_avg=0
H_z_avg=0
j=0
for i in range(NAtom):
H2O.Atoms.append(Atoms)
H2O.XYZ_Coords=GeomBlock
H2O.XYZ_Coords=GeomBlock
H2O.XYZ_Coords=GeomBlock
j+=1
if (i+1)%3==0:
Molecules.append(H2O)
print(i+1,H2O.XYZ_Coords)
j=0
print(Molecules.XYZ_Coords)
print(Molecules.XYZ_Coords)
在print(i+1,H2O.XYZ_Coords)这一句,可以看到得到的是不同原子的坐标,没有问题。但是在最后打印Molecules.XYZ_Coords时,(i=0,1),打印出的还是最后一个append的H2O的坐标。 lqhenwunai 发表于 2020-8-8 11:59
谢谢!我把 XYZ_Coords 和Atoms都放到init里定义,然后有以下调用:
Molecules=[]
麻烦把所有代码都发出来,而且请用代码格式发
https://fishc.com.cn/thread-52272-1-1.html 本帖最后由 lqhenwunai 于 2020-8-8 12:09 编辑
永恒的蓝色梦想 发表于 2020-8-8 12:02
麻烦把所有代码都发出来,而且请用代码格式发
https://fishc.com.cn/thread-52272-1-1.html
#!/usr/bin/python3
import sys
import numpy as np
class molecule:
def __init__(self):
self.Atoms=[]
self.XYZ_Coords=np.mat(np.zeros((3,3)))
def Get_dipole_for_each_molecule(Atoms,GeomBlock):
print("\n")
print("****WARNING2****: This is only for water")
Molecules=[]
H2O=molecule()
NMol=300
NAtom=len(Atoms)
H_x_avg=0
H_y_avg=0
H_z_avg=0
j=0
# tmp_mat=np.mat(np.zeros((3,3)))
for i in range(NAtom):
H2O.Atoms.append(Atoms)
# tmp_mat=GeomBlock
# tmp_mat=GeomBlock
# tmp_mat=GeomBlock
H2O.XYZ_Coords=GeomBlock
H2O.XYZ_Coords=GeomBlock
H2O.XYZ_Coords=GeomBlock
# H2O.XYZ_Coords=tmp_mat
j+=1
if (i+1)%3==0:
Molecules.append(H2O)
print(i+1,H2O.XYZ_Coords)
j=0
if i==10:
break
print(Molecules.XYZ_Coords)
print(Molecules.XYZ_Coords)
for i in range(300):
pass
# print(Molecules.Atoms,Molecules.XYZ_Coords)
# H_x_avg=H_x_avg+GeomBlock
# H_y_avg=H_y_avg+GeomBlock
# H_z_avg=H_z_avg+GeomBlock
其中Atoms 是个NAtom 大小的由字符串组成的列表。GeomBlock是一个(NAtom,3)维的由numpy定义的matrix。如果需要的话我就再贴上。只是可能就会比较长... lqhenwunai 发表于 2020-8-8 12:05
其中Atoms 是个NAtom 大小的由字符串组成的列表。GeomBlock是一个(NAtom,3)维的由numpy定义的matr ...
你这个注释有点让我哭笑不得{:10_250:}
页:
[1]