Как изменить строки массивов numpy, хранящихся в виде списка

#python #arrays #list #numpy

#python #массивы #Список #numpy

Вопрос:

Я хочу изменить строки массивов numpy, хранящихся в списке. длина моих массивов numpy не одинакова. У меня есть несколько огромных массивов numpy, хранящихся в виде списка. Это мои данные (для простоты я скопировал только небольшой список массива):

 elements= [array([[971, 466, 697, 1, 15, 18, 28],
                 [5445, 4, 301, 2, 12, 47, 5]]),
           array([[5883, 316, 377, 2, 9, 87, 1]])]
  

Затем я хочу заменить четвертый столбец каждой строки на последний, а затем удалить последний столбец. Я хочу получить следующий результат:

 [array([[971, 466, 697, 1, 28, 18],
        [5445, 4, 301, 2, 5, 47]]),
 array([[5883, 316, 377, 2, 1, 87]])]
  

Я попробовал следующий код, но он не увенчался успехом:

 length=[len(i) for i in elements] # To find the length of each array
h=sum(length) # to find the total number of rows
for i in range (h):
    elements[:,[4,-1]] = elements[:,[-1,4]]
    elements=np.delete(elements,[-1],1)
  

Я столкнулся со следующей ошибкой:

 TypeError: list indices must be integers or slices, not tuple
  

Я заранее признателен за помощь.

Ответ №1:

Вы можете сделать это без циклов, но это все равно медленнее (в 1,75 раза для больших данных), чем принятое решение:

 counts = list(map(len, elements))
arr = np.concatenate(elements)
arr[:, 4] = arr[:, -1]
new_elements = np.split(arr[:,:-1], np.cumsum(counts)[:-1])
  

Конкатенация происходит довольно медленно numpy .

Ответ №2:

Простое неэффективное решение:

 import numpy as np

elements= [np.array([[971, 466, 697, 1, 15, 18, 28],
                     [5445, 4, 301, 2, 12, 47, 5]]),
           np.array([[5883, 316, 377, 2, 9, 87, 1]])]

new_elements = list()
for arr in elements:
    arr[:, 4] = arr[:, -1]
    new_elements.append(arr[:, :-1])
  

Новый вывод списка:

 new_elements
Out[11]: 
[array([[ 971,  466,  697,    1,   28,   18],
        [5445,    4,  301,    2,    5,   47]]),
 array([[5883,  316,  377,    2,    1,   87]])]
  

Комментарии:

1. Уважаемый @Mathieu, спасибо за ваше решение. Это именно то, что я хотел. Я действительно ценю это.

Ответ №3:

Попробуйте это

 p=[]
for x in range(len(elements)):
    for y in range(len(elements[x])):
         p.append(list(elements[x][y][:4]) [elements[x][y][-1]] [elements[x][y][-2]])
print(p)

[[971, 466, 697, 1, 28, 18],
[5445, 4, 301, 2, 5, 47],
[5883, 316, 377, 2, 1, 87]]