Удалить массив из 2D-массива в цикле for

#python #numpy #for-loop #multidimensional-array

#python #numpy #for-цикл #многомерный массив

Вопрос:

У меня есть 2D-массив с координатами 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. ]])
 

Я хочу удалять по одному подмассиву за раз, когда я перебираю 2D-массив. Так что в первом цикле первый подмассив будет удален, а 2D-массив будет

 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. ]])
 

Во втором цикле второй подмассив будет удален, а 2D-массив будет

 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)
 

Но мой код, похоже, уменьшает 2D-массив до 1D-массива. Кто-нибудь знает, как это исправить?

Большое спасибо за вашу поддержку и помощь.

С уважением

Уилсон

Комментарии:

1. Вы смотрели np.argwhere(points2 == p1) ? Соответствует ли это np.delete требованиям? Практикуйтесь в использовании np.delete с простыми числами, чтобы у вас было четкое представление о том, что он делает. Другими словами, делайте небольшие шаги, убедившись, что каждый из них делает то, что вы хотите, и вы понимаете, почему.

2. Попробуйте сначала выбрать все строки для удаления, а затем выполнить только одну delete . Повторные удаления в цикле будут медленнее.

Ответ №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]
 

Вместо удаления из списка вы можете создать новый список без элемента i th. Тот же код должен также работать для массивов numpy.

Примечание: если вы просто хотите создать список координат с учетом xline , yline , и zline , вероятно, гораздо проще использовать понимание списка Python:

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

Это вернет список в виде

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

Комментарии:

1. @ Ziming Shan большое спасибо за вашу большую помощь. ваш код работал отлично