Есть ли способ вставить элементы из списка в каждую позицию knth во втором списке? - PullRequest
2 голосов
/ 21 апреля 2020

Мне нужно поместить все элементы из моего первого списка в k-е позиции второго списка. Где k = 0,1,2... и n - это одно число. В настоящее время я делаю это (используя numpy)

#create numpy array
positionList = np.array([])

positions = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

epochs = np.array([10, 11, 12])

for pos,epoch in zip(positions,epochs):
    position = np.insert(pos,0,epoch)

    if len(positionList) > 0:
        positionList = np.concatenate((positionList,position)) 
    else:
        positionList = position

positionList = np.around(positionList,1).tolist()
#expected output [10, 1, 2, 3, 11, 4, 5, 6, 12, 7, 8, 9]

Где позиции 2D. Я пытаюсь найти наиболее эффективный (временной и пространственный) способ сделать это с помощью numpy.

Примечание: Приведенный выше код работает. Я просто хочу сделать это эффективным.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Просто используйте параметр axis, равный np.concatenate():

import numpy as np


positions = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
epochs = np.array([10, 11, 12])
print(np.concatenate([epochs[..., None], positions], axis=1).ravel())
# [10  1  2  3 11  4  5  6 12  7  8  9]

При написании этого кода цикл не пострадал.

1 голос
/ 22 апреля 2020

Если вы на самом деле вводите два list с, нет необходимости использовать NumPy здесь:

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [10, 11, 12]

print([z for x, y in zip(b, a) for z in [x] + y])
# [10, 1, 2, 3, 11, 4, 5, 6, 12, 7, 8, 9]
%timeit [z for x, y in zip(b, a) for z in [x] + y]
# 1000000 loops, best of 3: 1.04 µs per loop

или, если a плоский, и вы указываете разрыв каждые n elements:

n = 3
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [10, 11, 12]

print([z for x, y in zip(b, zip(*[iter(a)] * n)) for z in (x,) + y])
# [10, 1, 2, 3, 11, 4, 5, 6, 12, 7, 8, 9]
%timeit [z for x, y in zip(b, zip(*[iter(a)] * n)) for z in (x,) + y]
# 1000000 loops, best of 3: 1.31 µs per loop

Для сравнения вот решение на основе NumPy:

import numpy as np


a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([10, 11, 12])
print(np.concatenate([b[..., None], a], axis=1).ravel().tolist())
# [10, 1, 2, 3, 11, 4, 5, 6, 12, 7, 8, 9]
%timeit np.concatenate([b[..., None], a], axis=1).ravel().tolist()
# 100000 loops, best of 3: 2.43 µs per loop

Они показывают, что, по крайней мере для ваших входов, Python * 1013 решение на основе * на самом деле быстрее, чем прибегать к NumPy.

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