如何提取numpy数组的某些特定行

2024-06-08 17:11:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个unmpy数组,希望提取数组中的一些行。我的数组有三列,分别是x、y和z坐标:

sr_y=np.array([[10., 1., 8.], [20., 1., 8.1], [30., 1., 7.9], [10., 2., 8.],\
              [20., 2., 7.9], [30., 2., 8.], [10., 1., 1.9], [20., 1., 2.],\
              [10., 2., 2.1], [20., 2., 2.2], [30., 2., 1.8]])

数组被排序为1。第二列中具有相同值的行就是此类子集。sr_y的前三行在第二列中具有相同的值,因此我想要最后一行([30., 1., 7.9])。然后,第4行、第5行和第6行构成下一个子集,我想要最后一行(第6行)。然后,从第6行到第7行,第三列变化很大(从81.9)。从这里到结尾,我想提取每个子集的第一行。第7行和第8行是一个子集,我想要第7行。从第9行、第10行和第11行,我想要第一行(第9行)。简单地说,我想介绍以下阵列:

np.array([[30., 1., 7.9], [30., 2., 8.], [10., 1., 1.9], [10., 2., 2.1]])

我尝试了以下代码,但它没有提供我想要的:

exported_data=np.array([])
for i in range (len(sr_y)-1):
    if sr_y[i,1] != sr_y[i+1,1] or sr_y[i-1,2]>int (sr_y[i,2]+4):
        aa=sr_y[i]
        exported_data=np.append (exported_data,aa)
exported_data=exported_data.reshape(-1,3)

事实上,在第三列发生较大变化后,它无法修改导出的作用。在那个大的改变之后,我想导出每个子集的第一行。提前,谢谢你的帮助。我非常感谢你的贡献


Tags: 代码infordata排序结尾np数组
1条回答
网友
1楼 · 发布于 2024-06-08 17:11:20

您可以使用一个标志来指示是否已经发生了大步

delta = 4
before = True
for i in range(sr_y.shape[0]-1):
    if before and sr_y[i][0] > sr_y[i+1][0]:
        print('(last)', sr_y[i])
    if sr_y[i][2] > sr_y[i+1][2] + delta:
        before = False
    if not before and sr_y[i][0] > sr_y[i+1][0]:
        print('(first)', sr_y[i+1])

第一个条件将捕获大步before)之前所有子集的最后一个值(>check)。第二个条件处理标志开关。而第三个也是最后一个条件捕获大步not before)之后所有子集的第一个值(>check)

注意:相应地用list.append()替换print()调用。重要的是,条件保持在这个顺序。由于在出现大集合的迭代中,它必须捕获前一个子集的最后一个值和下一个子集的第一个值

相关问题 更多 >