#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]]