Вставить в массив в указанном c месте - PullRequest
0 голосов
/ 06 августа 2020

У меня есть массив [ 0 10 15 20 10 0 35 25 15 35 0 30 20 25 30 0], и мне нужно вставить каждый элемент другого массива '[5,7,8,15]' в места с шагом 5, чтобы окончательный массив выглядел [ 0 10 15 20 5 10 0 35 25 7 15 35 0 30 8 20 25 30 0 15] length is 20

Я пытаюсь использовать этот код

arr_fla = [ 0 10 15 20 10  0 35 25 15 35  0 30 20 25 30  0]
arr_split = [5,7,8,15]
node = 5   
    node_len = node * (node-1)
    
    for w in range(node, node_len, 5):
        for v in arr_split:
            arr_fla = np.insert(arr_fla,w,v)
    print(arr_fla)

Результат, который я получаю:

'[ 0 10 15 20 10 15  8  7  5  0 15  8  7  5 35 15  8  7  5 25 15 35  0 30
 20 25 30  0]' length 28

Может кто-нибудь, пожалуйста, скажите мне, где я ошибаюсь.

Ответы [ 5 ]

1 голос
/ 06 августа 2020

Если размеры совпадают так же четко, как в вашем примере, вы можете использовать reshape ...

np.reshape(arr_fla,(len(arr_split),-1))
# array([[ 0, 10, 15, 20],
#        [10,  0, 35, 25],
#        [15, 35,  0, 30],
#        [20, 25, 30,  0]])

... добавить arr_split в качестве нового столбца ...

np.c_[np.reshape(arr_fla,(len(arr_split),-1)),arr_split]
# array([[ 0, 10, 15, 20,  5],
#        [10,  0, 35, 25,  7],
#        [15, 35,  0, 30,  8],
#        [20, 25, 30,  0, 15]])

... и снова сплющить ...

np.c_[np.reshape(arr_fla,(len(arr_split),-1)),arr_split].ravel()
# array([ 0, 10, 15, 20,  5, 10,  0, 35, 25,  7, 15, 35,  0, 30,  8, 20, 25,
#        30,  0, 15]) 
0 голосов
/ 06 августа 2020

вы можете изменить на ниже и попробовать.

import numpy as np

arr_fla = [0, 10, 15, 20, 10, 0, 35, 25, 15, 35, 0, 30, 20, 25, 30, 0]
arr_split = [5, 7, 8, 15]

index = 4
for ele in arr_split:
    arr_fla = np.insert(arr_fla, index, ele)
    index += 5
print(arr_fla)

результат будет

[ 0 10 15 20  5 10  0 35 25  7 15 35  0 30  8 20 25 30  0 15]

о неправильной вашей части, я думаю, у него есть два вопроса:

  1. второй l oop не нужен, это заставит np вставить все элементы arr_split в ту же позицию
  2. позиция не начинается с 5, она должна быть 4
0 голосов
/ 06 августа 2020

Вы хотите, чтобы счетчик продолжал расти каждый раз, когда вы вставляете элемент из вашего второго массива arr_split.

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

arr_fla = [0,10,15,20,10,0,35,25,15,35,0,30,20,25,30,0]
arr_split = [5,7,8,15]

j = 0 #use this as a counter to insert from arr_split

#start iterating from 4th position as you want to insert in the 5th position

for i in range(4,len(arr_fla),5): 

    arr_fla.insert(i,arr_split[j]) #insert at the 5th position every time
    #every time you insert an element, the array size increase

    j +=1 #increase the counter by 1 so you can insert the next element

arr_fla.append(arr_split[j]) #add the final element to the original array 
print(arr_fla)

Вывод:

[0, 10, 15, 20, 5, 10, 0, 35, 25, 7, 15, 35, 0, 30, 8, 20, 25, 30, 0, 15]
0 голосов
/ 06 августа 2020

Вы можете разделить список на четные части, добавить к каждому разделенные значения для каждого фрагмента и повторно собрать целое (кредит Неду Батчелдеру за функцию фрагмента ):

arr_fla = [0,10,15,20,10,0,35,25,15,35,0,30,20,25,30,0]
arr_split = [5,7,8,15]
node = 5  

def chunks(lst, n):
    """Yield successive n-sized chunks from lst."""
    for i in range(0, len(lst), n):
        yield lst[i:i + n]

tmp_arr = chunks(arr_fla, node)

arr_out = []

for index, chunk in enumerate(tmp_arr):
    if arr_split[index]: # make sure arr_split is not exhausted
        chunk.append(arr_split[index]) # we use the index of the chunks list to access the split number to insert 
    arr_out += chunk

print(arr_out)

Выходы:

[0, 10, 15, 20, 10, 5, 0, 35, 25, 15, 35, 7, 0, 30, 20, 25, 30, 8, 0, 15]
0 голосов
/ 06 августа 2020

Я исправил:

arr_fla = [0,10,15,20,10,0,35,25,15,35,0,30,20,25,30,0]
arr_split = [5,7,8,15]
node = 5
    
for w in range(len(arr_split)):
    arr_fla = np.insert(arr_fla, (w+1)*node-1, arr_split[w])
print(arr_fla)

'''
Output:
[ 0 10 15 20  5 10  0 35 25  7 15 35  0 30  8 20 25 30  0 15]
'''

В вашем коде:

for v in arr_split:

Это получает все элементы сразу (всего w раз), но вам нужно только по одному элементу за раз. Таким образом, вам не понадобится дополнительный for l oop.

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