Невозможно заменить массив внутри кортежа другим массивом того же размера — Python

#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 , чтобы указать, что вам не нужен результат функции.