Изменить форму вещания функции из неправильной формы numpy

Я пытаюсь изменить форму numpy.array из формы (4,4) в форму (2,2,2,2). Ошибка, которую я получаю:

ValueError: could not broadcast input array from shape (2,2,2,2) into shape (4,4).

Это заставляет меня думать, что у меня есть формы задом наперед, но после проверки это не так.

У меня есть определяемая пользователем функция, которая использует np.reshape для преобразования массива в определенную форму, если она еще не такая. Я попытался удалить определяемую пользователем функцию и использовать только np.reshape, но она вернула ту же ошибку. Что мне не хватает?

Функция изменения формы:

def reshape(matrix, ports, modes):
    shape = (ports, ports, modes, modes)
    if (np.shape(matrix) != shape): #reshape if necessary
        return np.reshape(matrix, shape)
    else:
        return matrix

Где я вызываю эту функцию:


def plot(S, F, ports, modes, x_range, y_range, title, f_units, 
         multi_modal = True):
    data = {} #create dictionary to store S-parameters
    if (not multi_modal): #if we want average
        for f in range(0, len(F)): #iterate through frequencies
            print(np.shape(S[f]))
            S[f] = reshape(S[f], ports, modes)

В этом случае порты = 2 и режимы = 2.

S[f] представляет собой np.массив формы (4,4):

[[ 1.00000000e+00+0.00000000e+00j -1.02728868e-19+1.64952184e-22j
  -1.37762998e-20+2.40441793e-24j -4.18063430e-24-1.18287261e-21j]
 [ 0.00000000e+00-0.00000000e+00j -1.00000000e+00+1.22464680e-16j
   3.03393173e-26-1.77961140e-24j  1.57277027e-25+2.06062998e-23j]
 [-1.95100984e-27+3.66506948e-24j  2.38762635e-25+1.48052807e-22j
   1.00000000e+00+0.00000000e+00j  2.90518731e-20+1.33913685e-17j]
 [-3.47614015e-25-4.08540212e-23j -3.30653510e-21+2.87402660e-23j
   1.77338192e-21+2.27000073e-19j -1.00000000e+00+1.22464680e-16j]]

Почему возвращает ошибку:

ValueError: could not broadcast input array from shape (2,2,2,2) into shape (4,4)

когда он должен измениться с (4,4) на (2,2,2,2)?

ваша проблема в том, как вы пытаетесь переназначить новую форму старому массиву

CAPSLOCK 09.04.2019 15:41

Вы правы, спасибо.

Alex Angus 09.04.2019 16:01
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
235
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это будет делать

def plot(S, F, ports, modes, x_range, y_range, title, f_units, 
         multi_modal = True):
    data = {} #create dictionary to store S-parameters
    if (not multi_modal): #if we want average
        for f in range(0, len(F)): #iterate through frequencies
            print(np.shape(S[f]))
            S_reshaped = reshape(S[f], ports, modes)

Если вам нужно сохранить свои результаты, вы можете создать пустой список, а затем добавить к нему измененный массив.

def plot(S, F, ports, modes, x_range, y_range, title, f_units, 
         multi_modal = True):
    data = {} #create dictionary to store S-parameters
    S_reshaped=[]
    if (not multi_modal): #if we want average
        for f in range(0, len(F)): #iterate through frequencies
            print(np.shape(S[f]))
            S_reshaped.append(reshape(S[f], ports, modes))

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