#python #arrays #list #replace #tuples
Вопрос:
У меня есть список кортежей:
Я хочу заменить второй np.массив первого кортежа массивом той же длины, но заполненным нулями:
Я попробовал следующее:
Coeff[0][1] =np.zeros(len(Coeff[0][1]))
Но я понимаю, что:
'tuple' object does not support item assignment
Есть идеи, как завершить процесс замены ?
Комментарии:
1. Кортежи в Python неизменяемы, возможно, вам потребуется использовать списки.
Ответ №1:
Кортежи неизменяемы в Python, вы не можете изменять значения, хранящиеся в нем.
Вы можете сделать list(map(list, list_of_tuples))
это для быстрого приведения в список, или [list(x) for x in list_of_tuples]
если вы хотите использовать понимание списка.
Я сделал какой-то уродливый тест времени на своем компьютере, и то, и другое кажется просто эквивалентным по скорости.
Комментарии:
1. Спасибо! Есть ли способ отменить его после замены?
2. @jokerp Конечно, вы можете разбить весь список на кортежи позже :
list(map(tuple, list_of_list))
Ответ №2:
Если вам не нужно сохранять исходные значения в массивах, вы можете использовать numpy.nan_to_num()
with copy=False
для изменения второго массива в кортеже на месте. Это имеет то преимущество, что не создает новых массивов.
В следующем примере второй массив каждого кортежа Coeff
заменяется нулями.
import numpy as np
Coeff = [
tuple(np.full((5, ), np.nan) for i in range(2))
for j in range(5)
]
print(Coeff)
nil = [np.nan_to_num(tup[1], copy=False) for tup in Coeff]
print(Coeff)
На выходе получается
[
(array([nan, nan, nan, nan, nan]), array([nan, nan, nan, nan, nan])),
(array([nan, nan, nan, nan, nan]), array([nan, nan, nan, nan, nan])),
(array([nan, nan, nan, nan, nan]), array([nan, nan, nan, nan, nan])),
(array([nan, nan, nan, nan, nan]), array([nan, nan, nan, nan, nan])),
(array([nan, nan, nan, nan, nan]), array([nan, nan, nan, nan, nan]))
]
[
(array([nan, nan, nan, nan, nan]), array([0., 0., 0., 0., 0.])),
(array([nan, nan, nan, nan, nan]), array([0., 0., 0., 0., 0.])),
(array([nan, nan, nan, nan, nan]), array([0., 0., 0., 0., 0.])),
(array([nan, nan, nan, nan, nan]), array([0., 0., 0., 0., 0.])),
(array([nan, nan, nan, nan, nan]), array([0., 0., 0., 0., 0.]))
]
Если вам нужна работа только с первым кортежем, вы можете использовать nil = np.nan_to_num(Coeff[0][1], copy=False)
. Обратите внимание, что я использую nil
, чтобы указать, что вам не нужен результат функции.