如果条件为真,则写入数组

时间:2017-07-24 08:05:15

标签: python arrays numpy

我试图只将包含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

的范围

由于

2 个答案:

答案 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数组,只需根据需要创建它们。

(编辑:我应该补充一点,你的代码/问题有点不完整,所以我可能误解了数组大小)