我试图只将包含Atom_No 1的行写入数组x_o,y_o ..但是我出错了。 x包含678个元素,X_o的形状为226. Atom_No看起来像这样[1,2,3,1,2,3,1,2,3 ...]。我想要与那些坐标相对应的坐标。
ii=0
x_o=numpy.zeros((226))
y_o=numpy.zeros((226))
z_o=numpy.zeros((226))
for i in range(678):
if (Atom_No[i]==1):
ii=ii+1
x_o[ii]=x[ii]
y_o[ii]=y[ii]
z_o[ii]=z[ii]
IndexError:索引226超出了轴0的大小为226
的范围由于
答案 0 :(得分:2)
在你的最后一次迭代中,你有
ii = 226
因为它符合你条件的三分之一(678/3)
并尝试访问元素
x[226]
不存在(最后一个索引是225,Python使用零索引)
我认为对你有用的是:
for i in range(678):
if (Atom_No[i]==1):
x_o[ii]=x[ii]
y_o[ii]=y[ii]
z_o[ii]=z[ii]
ii=ii+1
答案 1 :(得分:0)
Numpy旨在进行矢量化以避免for循环。您可以使用布尔掩码替换上面的那个:
hits = Atom_No == 1
x_o, y_o, z_o = x[hits], y[hits], z[hits]
这样您甚至不必预先分配x_o, y_o, z_o
数组,只需根据需要创建它们。
(编辑:我应该补充一点,你的代码/问题有点不完整,所以我可能误解了数组大小)