上述代码的问题Traceback (most recent call last): File "1.py", line 14, in <module> C_positions += structure.positions[structure.get_chemical_symbols() == 'C'] ValueError: operands could not be broadcast together with shapes (0,) (0,35,3)
时间: 2024-03-18 17:38:57 浏览: 55
这个错误通常是因为某些POSCAR文件中没有C原子,导致`structure.get_chemical_symbols() == 'C'`的结果是一个空数组,从而无法将空数组与`structure.positions`相加。为了解决这个问题,可以在累加C原子坐标之前,先检查是否存在C原子,例如:
```python
from ase.io import read
import numpy as np
# 读取多个POSCAR结构文件
structures = read(['POSCAR1', 'POSCAR2', 'POSCAR3'])
# 计算所有C原子的坐标
C_positions = []
for structure in structures:
if 'C' in structure.get_chemical_symbols():
C_positions += structure.positions[structure.get_chemical_symbols() == 'C']
# 计算C原子的平均位置
C_mean = np.mean(C_positions, axis=0)
# 计算C原子位置的标准差
C_std = np.std(C_positions, axis=0)
# 打印结果
print('C原子在晶胞中的平均位置:')
print(C_mean)
print('C原子在晶胞中的分布范围:')
print(C_std)
```
这段代码使用`if 'C' in structure.get_chemical_symbols():`判断POSCAR文件中是否存在C原子。如果存在,就将C原子的坐标添加到`C_positions`列表中。如果不存在,就跳过这个结构。这样,就可以避免空数组与`structure.positions`相加的问题。
阅读全文