【问题标题】:Remove array from 2D array in for loop从 for 循环中的二维数组中删除数组
【发布时间】:2021-03-03 14:51:00
【问题描述】:

我有一个二维数组,它是 x y z 坐标。

array([[ 1. ,  1. ,  1. ],
       [ 2. ,  3. ,  1. ],
       [ 3. ,  4. ,  1. ],
       [ 3.1,  5.1,  1. ],
       [ 3.2,  5.2,  1. ],
       [ 3.4,  5.3,  1. ],
       [ 3.5,  5.4,  1. ],
       [ 3.7,  5.5,  1. ],
       [ 3.8,  5.6,  1. ],
       [ 3.9,  5.7,  1. ],
       [ 4. ,  5.8,  1. ],
       [ 4.1,  5.9,  1. ],
       [ 4.2,  6. ,  1. ],
       [ 5. ,  6.1,  1. ],
       [ 9. ,  6.2,  1. ],
       [10. , 10. ,  1. ]])

我想在循环遍历二维数组时一次删除一个子数组。这样在第一个循环中,第一个子数组将被删除,二维数组将被删除

array([[ 2. ,  3. ,  1. ],
       [ 3. ,  4. ,  1. ],
       [ 3.1,  5.1,  1. ],
       [ 3.2,  5.2,  1. ],
       [ 3.4,  5.3,  1. ],
       [ 3.5,  5.4,  1. ],
       [ 3.7,  5.5,  1. ],
       [ 3.8,  5.6,  1. ],
       [ 3.9,  5.7,  1. ],
       [ 4. ,  5.8,  1. ],
       [ 4.1,  5.9,  1. ],
       [ 4.2,  6. ,  1. ],
       [ 5. ,  6.1,  1. ],
       [ 9. ,  6.2,  1. ],
       [10. , 10. ,  1. ]])

在第二个循环中,第二个子数组将被删除,二维数组将被删除

array([[ 1. ,  1. ,  1. ],
       [ 3. ,  4. ,  1. ],
       [ 3.1,  5.1,  1. ],
       [ 3.2,  5.2,  1. ],
       [ 3.4,  5.3,  1. ],
       [ 3.5,  5.4,  1. ],
       [ 3.7,  5.5,  1. ],
       [ 3.8,  5.6,  1. ],
       [ 3.9,  5.7,  1. ],
       [ 4. ,  5.8,  1. ],
       [ 4.1,  5.9,  1. ],
       [ 4.2,  6. ,  1. ],
       [ 5. ,  6.1,  1. ],
       [ 9. ,  6.2,  1. ],
       [10. , 10. ,  1. ]])

等等。

目前我所拥有的如下:

xline =[1, 2, 3, 3.1, 3.2, 3.4, 3.5, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 5, 9, 10]
yline =[1, 3, 4, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6,5.7, 5.8, 5.9, 6, 6.1, 6.2, 10]
zline =[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

df = DataFrame(xline,columns=['x_value'])
df['y_value']=yline
df['z_value']=zline

points=df.values

for p1 in points:
    points2=points[:]
    points3=np.delete(points2, np.argwhere(points2 == p1))
    print(points3)

但我的代码似乎将二维数组简化为一维数组。有谁知道如何解决这个问题?

非常感谢您的支持和帮助。

真诚的

威尔逊

【问题讨论】:

  • 你看np.argwhere(points2 == p1)了吗?这是否符合np.delete 的要求?练习使用带有简单数字的np.delete,这样您就可以清楚地了解它的作用。换句话说,采取小步骤,确保每个步骤都按照您的意愿行事,并且您了解原因。
  • 尝试先选择所有要删除的行,然后只做一个delete。循环中的重复删除会更慢。

标签: python numpy for-loop multidimensional-array


【解决方案1】:

这可以使用列表索引和连接来完成。我将在这里使用一个不同的(较短的)列表来演示,否则它会太长。

假设我们有一个列表

L = [1,2,3,4,5,6,7]

我们希望完全按照您的要求去做。那我们就可以了

for i in range(0, len(L)):
    new_L = L[0:i] + L[i+1:len(L)]
    print(new_L)    

输出:

[2, 3, 4, 5, 6, 7]
[1, 3, 4, 5, 6, 7]
[1, 2, 4, 5, 6, 7]
[1, 2, 3, 5, 6, 7]
[1, 2, 3, 4, 6, 7]
[1, 2, 3, 4, 5, 7]
[1, 2, 3, 4, 5, 6]

您可以创建一个没有ith 元素的新列表,而不是从列表中删除。相同的代码也应该适用于 numpy 数组。

旁注:如果您只是想创建一个坐标列表 给定 xlineylinezline,使用 Python 的列表理解可能要容易得多:

coords = [[x,y,z] for x,y,z in zip(xline,yline,zline)]

这将返回一个列表,格式为

coords =     [  [x1, y1, z1],
                [x2, y2, z2],
                [x3, y2, z3],
                    ...
   
              ]

【讨论】:

  • @紫铭山非常感谢您的大力帮助。您的代码运行良好
猜你喜欢
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
相关资源
最近更新 更多