Выбор всего первого элемента вложенного списка / массива - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть следующий вложенный список.

 peaks = [[313, 0.7608371709999999], [695, 0.6970320329999999], [996, 0.652950446], [1367, 0.570015382], [1518, 0.516312078], [1726, 0.5599991639999999], [1871, 0.5025837670000001], [2084, 0.563103466], [2240, 0.5229157010000001], [2478, 0.611383482], [2622, 0.59167585], [2987, 0.68685803], [3225, 0.524618916], [3573, 0.738796993], [3938, 0.8191861140000001], [4302, 0.82872904], [4666, 0.814913208], [5038, 0.7919655170000001], [5397, 0.773237498], [5762, 0.78905603]]

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

Я сделал это с использованием для l oop,

max_peaksIdx = []
max_peaksVal = []
for i in max_peaks:
    max_peaksIdx.append(i[0])
    max_peaksVal.append(i[1])

#out : max_peaksIsdx : [313, 695, 996, 1367, 1518, 1726, 1871, 2084, 2240, 2478, 2622, 2987, 3225, 3573, 3938, 4302, 4666, 5038, 5397, 5762]
#out: maxpeaksVal :[0.7608371709999999, 0.6970320329999999, 0.652950446, 0.570015382, 0.516312078, 0.5599991639999999, 0.5025837670000001, 0.563103466, 0.5229157010000001, 0.611383482, 0.59167585, 0.68685803, 0.524618916, 0.738796993, 0.8191861140000001, 0.82872904, 0.814913208, 0.7919655170000001, 0.773237498, 0.78905603]

Мне любопытно узнать, можно ли получить такой же результат, используя numpy нарезку? ( без с использованием для l oop)

что-то вроде

max_peaksIdx = peaks[:][0]  #this doesn't work, just picks the first element. but get a similar result shown above, but with one line code.

Ответы [ 4 ]

3 голосов
/ 03 февраля 2020

Да, это можно сделать!

import numpy as np

peaks = np.array(peaks)

max_peaksIsdx = peaks[:,0]
max_peaksVal = peaks[:,1]
1 голос
/ 03 февраля 2020

Вы можете использовать zip с распаковкой:

max_peaksIdx, max_peaksVal = zip(*peaks)

Вывод:

max_peaksIdx
# (313, 695, 996, ...)
max_peaksVal
# (0.7608371709999999, 0.6970320329999999, 0.652950446,...)

Если у вас есть для построения numpy массив:

arr = np.array(peaks)
max_peaksIdx, max_peaksVal = arr[:, 0], arr[:, 1]

Но zip примерно в 9 раз быстрее:

%timeit max_peaksIdx, max_peaksVal = zip(*peaks)
# 1.19 µs ± 91.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%%timeit
arr = np.array(peaks)
max_peaksIdx, max_peaksVal = arr[:, 0], arr[:, 1]
# 10 µs ± 120 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
0 голосов
/ 03 февраля 2020

Есть несколько способов сделать это. Во-первых, вы можете попробовать zip и unpacking как

lis = []
for i in range(len(peaks[0])):
    lis.append(list(list(zip(*peaks))[i]) )

. Это выведет lis как

[[313,
  695,
  996,
  1367,
  1518,
  1726,
  1871,
  2084,
  2240,
  2478,
  2622,
  2987,
  3225,
  3573,
  3938,
  4302,
  4666,
  5038,
  5397,
  5762],
 [0.7608371709999999,
  0.6970320329999999,
  0.652950446,
  0.570015382,
  0.516312078,
  0.5599991639999999,
  0.5025837670000001,
  0.563103466,
  0.5229157010000001,
  0.611383482,
  0.59167585,
  0.68685803,
  0.524618916,
  0.738796993,
  0.8191861140000001,
  0.82872904,
  0.814913208,
  0.7919655170000001,
  0.773237498,
  0.78905603]]

. Можно использовать только zip.

list( map(itemgetter(i), peaks)) 
0 голосов
/ 03 февраля 2020
   max_peaksIdx = peaks[:][0] 

также можно сделать как

   max_peaksIdx = peaks[0] #stores the first element in peaks
   max_peaksVal = peaks[1] #stores the second element in peaks

без «:», все без for для l oop.

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