Построить двумерный массив NumPy из элементов в списке кортежей - PullRequest
0 голосов
/ 25 января 2019

Учитывая список кортежей, таких как:

test = [(1, 'string1', 47.9, -112.8, 6400.0),
        (2, 'string2', 29.7, -90.8, 11.0),
        (3, 'string3', 30.8, -99.1, 1644.0),
        (4, 'string4', 45.8, -110.9, 7500.0),
        (5, 'string5', 43.9, -69.8, 25.0)]

Каков наиболее эффективный способ построения двумерного массива с использованием 3-го и 4-го элементов из каждого кортежа?

Желаемый вывод:

array([[47.9, 29.7, 30.8, 45.8, 43.9],
       [-112.8, -90.8, -99.1, -110.9, -69.8]]) 

Ответы [ 5 ]

0 голосов
/ 25 января 2019

zip список, slice это использование itertools.islice:

from itertools import islice

np.array(list(islice(zip(*test), 2, 4)))
# array([[  47.9,   29.7,   30.8,   45.8,   43.9],
#        [-112.8,  -90.8,  -99.1, -110.9,  -69.8]])
0 голосов
/ 25 января 2019

Вы можете подготовить данные вне numpy, используя понимание списка, которое выбирает 3-й и 4-й пункт. Тогда вам нужно только транспонировать полученный массив:

np.array([x[2:4] for x in test]).T
0 голосов
/ 25 января 2019

первый список:

the_first = [item[2] for item in test]

и второй:

 second = [item[3] for item in test]

и результат:

 result = np.array([the_first, second])
0 голосов
/ 25 января 2019

Вы можете попробовать это:

import numpy as np

test = [(1, 'string1', 47.9, -112.8, 6400.0), (2, 'string2', 29.7, -90.8, 11.0), (3, 'string3', 30.8, -99.1, 1644.0), (4, 'string4', 45.8, -110.9, 7500.0), (5, 'string5', 43.9, -69.8, 25.0)]

result = np.array([(item[3], item[4]) for item in test]).T
print(result)

# array([[-112.8,  -90.8,  -99.1, -110.9,  -69.8],
#       [6400. ,   11. , 1644. , 7500. ,   25. ]])
0 голосов
/ 25 января 2019

Вы можете преобразовать список кортежей непосредственно в массив, а затем использовать нарезку и транспонирование для получения желаемого результата:

import numpy as np

test = [(1, 'string1', 47.9, -112.8, 6400.0),
        (2, 'string2', 29.7, -90.8, 11.0),
        (3, 'string3', 30.8, -99.1, 1644.0),
        (4, 'string4', 45.8, -110.9, 7500.0),
        (5, 'string5', 43.9, -69.8, 25.0)]

arr = np.array(test, dtype=object)
result = arr[:, 2:4].T.astype(np.float32)
print(result)

Вывод

[[  47.9   29.7   30.8   45.8   43.9]
 [-112.8  -90.8  -99.1 -110.9  -69.8]]

Обратите внимание, что после выполнения arr = np.array(test) все делается на уровне numy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...