Использование циклов Numpy и while для генерации всех возможных комбинаций дополнений - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь построить N-мерный массив из 2 базовых массивов, которые показывают все возможные комбинации, возможные для добавления всех значений, таких как:

Array A = [N0, N1, N2, ... , Nn]

Array B = [M0, M1, M2, ..., Mn]

Combinations = [[N0+M0, N0 + M1, ..., N0+Mn],

                [N1+M0, N1 + M1, ..., N1 + Mn],
                .
                .
                .,
                ]

Я знаю, что могу использоватьдекартово произведение, чтобы найти все возможные комбинации (мне нет дела до повторения), однако мне не нужен продукт всех значений, мне нужно сложение.Мне кажется, что я не могу получить цикл while, который я кодировал, чтобы иметь возможность добавлять строки, поскольку он генерирует новые данные (код ниже).

import numpy as np
MassFlowOx = np.linspace(0.1,103,150)*10**-3
MassFlowFuel = np.linspace(0.1,75,150)*10**-3
size = len(MassFlowFuel)
size_final=size**2
MassFlowComb = np.zeros(size)
temp = np.zeros(size, dtype=float)
i=0
j=0
MassFlowCombArray = np.zeros(size)

# runs all possible combinations for the addition of values in arrays
while i<size-1:
    temp[i] = MassFlowFuel[i] + MassFlowOx[i]
    while j<size-1:
        MassFlowOx[i] = MassFlowOx[j]
        print MassFlowOx[i]        
        j += 1
    MassFlowComb[i] = temp[i]

    MassFlowCombArray[i] = np.append([MassFlowComb[0]], [MassFlowComb[i]], axis = 0)
    i+=1

print MassFlowComb[i]

Есть ли конкретная функция, которую я могу использовать?Мне не удалось определить метод, который добавляет все комбинации значений в цикле while, поскольку он выдает ошибку последовательности.

РЕДАКТИРОВАТЬ:

Оба ответаработал.Цикл for делает его N-мерным, а использование np.add.outer создает N-мерный массив.Для целей этого кода последний более полезен.

Спасибо за все ответы!

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Почему бы вам просто не использовать double for loop?

import numpy as np
MassFlowOx = np.linspace(0.1,103,150)*10**-3
MassFlowFuel = np.linspace(0.1,75,150)*10**-3
MassFlowComb = []
for a in MassFlowOx:
    for b in MassFlowFuel:
        MassFlowComb.append(a+b)
MassFlowComb = np.array(MassFlowComb)
0 голосов
/ 16 октября 2018

В этом случае лучше сделать цикл For-Loop, чем цикл while.Ваш код может быть таким простым:

import numpy as np

MassFlowOx = np.linspace(0.1,103,150)*10**-3
MassFlowFuel = np.linspace(0.1,75,150)*10**-3

MassFlowComb = []

for  Fo in MassFlowOx:
  sub_list = []
  for  Ff in MassFlowFuel:
    sub_list.append(Fo+Ff)
  MassFlowComb.append(sub_list)

print(np.asarray(MassFlowComb))

Обратите внимание, что я использовал список для добавления сумм, но вы можете сделать это с помощью numpy

0 голосов
/ 16 октября 2018

То, что вам нужно, уже реализовано в NumPy и называется np.add.outer.Если вы хотите принять разницу, просто замените add на subtract.Если вы хотите взять продукт, просто используйте outer.Для массивов Nx1 и Mx1 результат будет иметь размеры NxM.

Ниже приведен простой пример:

import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.add.outer(a, b)

array([[5, 6, 7], # [[1+4, 1+5, 1+6],
   [6, 7, 8],     #  [2+4, 2+5, 2+6],
   [7, 8, 9]])    #  [3+4, 3+5, 3+6]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...