Я пытаюсь построить 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 делает его inN-мерным и с использованием np.add.outer
делает N-мерный массив. Для целей этого кода последнее более полезно.
Спасибо за все ответы!
То, что вам нужно, уже реализовано в 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]]
Почему бы вам просто не использовать двойной цикл?
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)
Для этого случая лучше сделать For-Loop, чем While-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 Fo in MassFlowOx:
sub_list = []
for Ff in MassFlowFuel:
sub_list.append(Fo+Ff)
MassFlowComb.append(sub_list)
print(np.asarray(MassFlowComb))
Обратите внимание, что я использовал список для добавления сумм, но вы можете сделать это с помощью numpy