Изменить список списков кортежей в массив NumPy - PullRequest
0 голосов
/ 03 сентября 2018

Я довольно новичок в python и сталкиваюсь с некоторыми проблемами, которые кажутся довольно простыми, но я не могу понять это.

У меня есть список координат, который выглядит так:

[(- 80983,957, 175470,593, 393,486), (-80994,122, 175469,889, 394,391), (-80996,591, 175469,757, 394,595), (-81006,72, 175469,298, 395,527), (-81019,538, 175468, 395468). -81025.594, 175467.643, 397.395), (-81030.366, 175467.25, 397.858), (-81030.455, 175467.776, 397.886), (-81033.209, 175470.89, 398.192)], [(-81037.166, 175471.423, 398.729), (-81037.911, 175471.237, 398.764), (-81038.01, 175472.285, 398.533)], [(-81030.537, 175472.562, 397.951), (-81029.792, 175472.896, 397.842), (-81029.668, 175472.131, 397.895)], [(-80847,281, 175417,644, 378,2), (-80853,651, 175417,621, 378,781)]

и я хотел бы преобразовать его в массив формы (:,3), чтобы каждая строка содержала 1 набор координат x, y, z.

Я попробовал основы np.asarray, но он возвращает мне только элемент последнего [(,,),(,,)] "абзаца", поэтому:

[(-80847.281, 175417.644, 378.2), (-80853.651, 175417.621, 378.781)]

Я также читал о вложенном списке и пробовал несколько методов, чтобы сгладить списки, но это дает мне такие же неудачные результаты.

Я хотел бы иметь массив, содержащий все эти "абзацы". У вас есть идея, как это сделать? И почему он возвращает только последний «абзац»?

Я не нашел эквивалентных форм списков (если это может помочь, я получил его из файла dxf с функцией dxfgrabber).

Ответы [ 4 ]

0 голосов
/ 03 сентября 2018

Если я скопирую и вставлю ваш образец в сеанс Python, я получу кортеж из 4 списков:

In [685]: [(-80983.957, 175470.593, 393.486), (-80994.122, 175469.889, 394.391), (-80996.591, 1754
     ...: 69.757, 394.595), (-81006.72, 175469.298, 395.527), (-81019.538, 175468.399, 396.847), (
     ...: -81025.594, 175467.643, 397.395), (-81030.366, 175467.25, 397.858), (-81030.455, 175467.
     ...: 776, 397.886), (-81033.209, 175470.89, 398.192)], [(-81037.166, 175471.423, 398.729), (-
     ...: 81037.911, 175471.237, 398.764), (-81038.01, 175472.285, 398.533)], [(-81030.537, 175472
     ...: .562, 397.951), (-81029.792, 175472.896, 397.842), (-81029.668, 175472.131, 397.895)], [
     ...: (-80847.281, 175417.644, 378.2), (-80853.651, 175417.621, 378.781)]
Out[685]: 
([(-80983.957, 175470.593, 393.486),
  (-80994.122, 175469.889, 394.391),
  (-80996.591, 175469.757, 394.595),
  (-81006.72, 175469.298, 395.527),
  (-81019.538, 175468.399, 396.847),
  (-81025.594, 175467.643, 397.395),
  (-81030.366, 175467.25, 397.858),
  (-81030.455, 175467.776, 397.886),
  (-81033.209, 175470.89, 398.192)],
 [(-81037.166, 175471.423, 398.729),
  (-81037.911, 175471.237, 398.764),
  (-81038.01, 175472.285, 398.533)],
 [(-81030.537, 175472.562, 397.951),
  (-81029.792, 175472.896, 397.842),
  (-81029.668, 175472.131, 397.895)],
 [(-80847.281, 175417.644, 378.2), (-80853.651, 175417.621, 378.781)])

np.vstack отлично справляется с преобразованием этого в 2d массив:

In [686]: np.vstack(_)
Out[686]: 
array([[-80983.957, 175470.593,    393.486],
       [-80994.122, 175469.889,    394.391],
       [-80996.591, 175469.757,    394.595],
       [-81006.72 , 175469.298,    395.527],
       [-81019.538, 175468.399,    396.847],
       [-81025.594, 175467.643,    397.395],
       [-81030.366, 175467.25 ,    397.858],
       [-81030.455, 175467.776,    397.886],
       [-81033.209, 175470.89 ,    398.192],
       [-81037.166, 175471.423,    398.729],
       [-81037.911, 175471.237,    398.764],
       [-81038.01 , 175472.285,    398.533],
       [-81030.537, 175472.562,    397.951],
       [-81029.792, 175472.896,    397.842],
       [-81029.668, 175472.131,    397.895],
       [-80847.281, 175417.644,    378.2  ],
       [-80853.651, 175417.621,    378.781]])

Пара объяснений

В большинстве случаев разделение объектов Python запятой приводит к кортежу (даже без () `:

In [687]: x = [1,2,3],[4,5,6,6]
In [688]: x
Out[688]: ([1, 2, 3], [4, 5, 6, 6])

vstack итерирует по входному списку или кортежу и превращает каждый элемент в двумерный массив. Затем он объединяет их вдоль 1-й оси.

In [690]: [np.atleast_2d(i) for i in x]
Out[690]: [array([[1, 2, 3]]), array([[4, 5, 6, 6]])]

В этом случае конкатенация не будет работать, поскольку количество столбцов не совпадает; в вашем 4 списках содержится несколько наборов из 3 элементов, поэтому они становятся (n, 3) массивами.

0 голосов
/ 03 сентября 2018

Вы действительно хотите сгладить свой список?

import itertools

flattened_list = list(itertools.chain.from_iterable(original_list))
0 голосов
/ 03 сентября 2018

Учитывая список списков, введенный L со структурой, как указано, вы можете сгладить свой список списков и подать на np.array:

import numpy as np
from itertools import chain

res = np.array(list(chain.from_iterable(L)))

print(res)

array([[ -80983.957,  175470.593,     393.486],
       [ -80994.122,  175469.889,     394.391],
       [ -80996.591,  175469.757,     394.595],
       ...
       [ -81029.668,  175472.131,     397.895],
       [ -80847.281,  175417.644,     378.2  ],
       [ -80853.651,  175417.621,     378.781]])
0 голосов
/ 03 сентября 2018

Если я правильно понимаю, вам нужен массив формы (n,3), то есть длина n массив длины 3 координаты. Вы можете сделать это со списком и конструктором np.array:

import numpy as np
l = [[(-80983.957, 175470.593, 393.486), (-80994.122, 175469.889, 394.391), (-80996.591, 175469.757, 394.595), (-81006.72, 175469.298, 395.527), (-81019.538, 175468.399, 396.847), (-81025.594, 175467.643, 397.395), (-81030.366, 175467.25, 397.858), (-81030.455, 175467.776, 397.886), (-81033.209, 175470.89, 398.192)],
[(-81037.166, 175471.423, 398.729), (-81037.911, 175471.237, 398.764), (-81038.01, 175472.285, 398.533)],
[(-81030.537, 175472.562, 397.951), (-81029.792, 175472.896, 397.842), (-81029.668, 175472.131, 397.895)],
[(-80847.281, 175417.644, 378.2), (-80853.651, 175417.621, 378.781)]]
a = np.array([list(t) for ll in l for t in ll])

, что дает a как:

array([[ -80983.957,  175470.593,     393.486],
       [ -80994.122,  175469.889,     394.391],
       [ -80996.591,  175469.757,     394.595],
       [ -81006.72 ,  175469.298,     395.527],
       [ -81019.538,  175468.399,     396.847],
       [ -81025.594,  175467.643,     397.395],
       [ -81030.366,  175467.25 ,     397.858],
       [ -81030.455,  175467.776,     397.886],
       [ -81033.209,  175470.89 ,     398.192],
       [ -81037.166,  175471.423,     398.729],
       [ -81037.911,  175471.237,     398.764],
       [ -81038.01 ,  175472.285,     398.533],
       [ -81030.537,  175472.562,     397.951],
       [ -81029.792,  175472.896,     397.842],
       [ -81029.668,  175472.131,     397.895],
       [ -80847.281,  175417.644,     378.2  ],
       [ -80853.651,  175417.621,     378.781]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...