Вставка нулей в несколько мест массива в Python

У меня есть список T2 и массив X. Я хочу вставить нули в определенные места X в соответствии с T2. Например, для X[0] нули должны быть вставлены во все места, кроме тех, которые указаны в T2[0], а для X[1] нули должны быть вставлены во все места, кроме тех, которые указаны в T2[1]. Я представляю текущие и ожидаемые результаты.

import numpy as np

T2=[[0, 3, 5, 8, 9, 10, 11],[0, 2, 3, 5, 6, 8, 9, 10, 11]]

X=np.array([np.array([4.17551036e+02, 3.53856161e+02, 2.82754301e+02, 1.34119055e+02,
              6.34573886e+01, 2.08344718e+02, 1.00000000e-24])               ,
       np.array([4.17551036e+02, 3.32821605e+02, 2.94983702e+02, 2.78809292e+02,
              1.26991664e+02, 1.36026510e+02, 8.31512525e+01, 2.07329562e+02,
              1.00000000e-24])                                               ],
      dtype=object)

C1=0.0

index=0

for m in range(0,len(X)):
    for j in range(T2[m][-1]):
        if (j!=T2[m][index]):
            X[m] = np.insert(X[m], j, C1, axis=None)  
        else:
            index+=1

print([X])

Текущий выход

[array([array([4.17551036e+02, 0.00000000e+00, 0.00000000e+00, 3.53856161e+02,
              0.00000000e+00, 2.82754301e+02, 0.00000000e+00, 0.00000000e+00,
              1.34119055e+02, 6.34573886e+01, 2.08344718e+02, 1.00000000e-24]),
       array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
              0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
              0.00000000e+00, 4.17551036e+02, 3.32821605e+02, 2.94983702e+02,
              2.78809292e+02, 1.26991664e+02, 1.36026510e+02, 8.31512525e+01,
              2.07329562e+02, 1.00000000e-24])                               ],
      dtype=object)]

Ожидаемый результат

[array([array([4.17551036e+02, 0.00000000e+00, 0.00000000e+00, 3.53856161e+02,
              0.00000000e+00, 2.82754301e+02, 0.00000000e+00, 0.00000000e+00,
              1.34119055e+02, 6.34573886e+01, 2.08344718e+02, 1.00000000e-24]),
       array([4.17551036e+02, 0.00000000e+00, 3.32821605e+02, 2.94983702e+02,
              0.00000000e+00, 2.78809292e+02, 1.26991664e+02, 0.00000000e+00,
              1.36026510e+02, 8.31512525e+01, 2.07329562e+02, 1.00000000e-24]) ],
      dtype=object)]   

После вставки индексы следующих записей сдвигаются на единицу. Простое решение - запустить "j" и "index" в обратном порядке по индексам.

Michael Butscher 01.01.2023 13:01

Я не уверен, что следую за тобой.

AEinstein 01.01.2023 13:17

Прости, забудь, здесь не было смысла. Вам просто нужно сбросить «индекс» на 0 во (в начале) внешнего цикла for, потому что он должен сбрасываться для каждого нового подсписка в «T2».

Michael Butscher 01.01.2023 13:27

Мне было интересно, есть ли способ сбросить индекс. Я действительно не знаю :(

AEinstein 01.01.2023 13:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы слишком усложняете вещи. Вы можете перефразировать свою проблему так: создайте массив с нулями везде, кроме индексов в T2. Возьми те из X.

def make_array(indices, values):
    rtrn = np.zeros(np.max(indices) + 1, dtype=values.dtype)
    rtrn[indices] = values
    return rtrn


X = np.array([make_array(Ti, Xi) for Ti, Xi in zip(T2, X)], dtype=object)

У вас есть две разные задачи, составные структуры данных усложняют проблему, если вы разделяете данные на:

Т1 = [0, 3, 5, 8, 9, 10, 11]

Т2 = [0, 2, 3, 5, 6, 8, 9, 10, 11]

X1 = np.array([4.17551036e+02, 3.53856161e+02, 2.82754301e+02, 1.34119055e+02,
              6.34573886e+01, 2.08344718e+02, 1.00000000e-24])

X2 = np.array([4.17551036e+02, 3.32821605e+02, 2.94983702e+02, 2.78809292e+02,
              1.26991664e+02, 1.36026510e+02, 8.31512525e+01, 2.07329562e+02,
              1.00000000e-24])

Ваши две разные проблемы могут быть решены с помощью:

Y1 = np.zeros((12))
for i, value in zip(T1,X1):
    Y1[i] = value

Y2 = np.zeros((12))
for i1, i2 in enumerate(T2):
    Y2[i2] = X2[i1]

Другие вопросы по теме