#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 большое спасибо за вашу большую помощь. ваш код работал отлично