Генерировать комбинации массивов

У меня есть 9 массивов, которыми я хочу манипулировать, чтобы найти все возможные комбинации, чтобы имя полученного массива подсказывало мне, какие массивы были объединены. Например:

a1_a2 = array1 - array2
a1_a3 = array1 - array3
a1_a4 = array1 - array4
.
.
.
a9_a6 = array9 - array6
a9_a7 = array9 - array7
a9_a8 = array9 - array8

Очевидно, я мог бы жестко это закодировать, но как я мог бы сделать это в цикле?

Я подумал написать для него функцию, что-то вроде:

def combineArrays(array1, array2):
    result_name = name_of_array1 + '_' + name_of_array2 # How would I do this bit?
    result = array1 - array2
    return result

for firstArray in arrays:
    for secondArray in reversed(arrays): # to go backwards through the list of arrays
        combineArrays(firstArray, secondArray)

Например, следующие массивы:

array1 = [1,2,nan,4,5]
array2 = [5,4,3,2,1]
array3 = [2,4,6,8,10]

должен производить вывод

a1_a2 = [-4,-2,nan,2,4]
a1_a3 = [-2,-4,nan,-8,-10]
a2_a1 = [4,2,nan,-2,-4]
a2_a3 = [2,-2,-6,-10,-14]
a3_a2 = [-2,2,6,10,14]
a3_a1 = [2,4,nan,8,10]

Итак, поэлементное вычитание для каждой возможной комбинации массивов.

Поскольку я использую numpy, существует ли вообще способ сделать это на основе линейной алгебры? И как мне заставить программу называть массивы за меня?

Этот вопрос вроде бы спрашивает нечто подобное, но я не понимаю ответа.

Вы манипулируете массивом, пока внешний цикл for выполняет итерацию по нему. Кроме того, .reverse() не возвращает массив, что означает, что внутренний цикл for, вероятно, завершится ошибкой. Вы, вероятно, захотите использовать reversed(arrays) или arrays[::-1], если хотите получить копию перевернутого списка.

UltraInstinct 26.07.2018 04:15

Я просто хочу вернуться назад по списку массивов. Думаю, массивы [:: - 1] подойдут лучше. Я обновлю.

Jim421616 26.07.2018 04:17

Что значит name_of_array1? Что бы вы хотели сделать, когда скажете array1 - array2 - поэлементное вычитание? Можете ли вы обновить свой пост, добавив урезанный образец ввода и образец вывода?

UltraInstinct 26.07.2018 04:21

1_2 и т. д. Не являются действительными идентификаторами Python. Вы просто не можете назвать переменные, которые

Mad Physicist 26.07.2018 06:44

@MadPhysicist да, вы совершенно правы; это просто идентификаторы, которые я привожу в качестве примеров. Я обновлю свой вопрос.

Jim421616 26.07.2018 06:45

Очень новичок - хотеть иметь отдельную именованную переменную для всего. Гораздо лучше выбрать подходящую структуру данных для управления вашими данными. Здесь бы неплохо было бы dict или даже 3D-матрицу. Я был бы рад опубликовать либо в ответе, если вы не настроены на именованные переменные

Mad Physicist 26.07.2018 06:47
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
6
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это обобщенный код, который работает с любой функцией: вы можете просмотреть его, чтобы понять, но он делает именно то, что вы хотите:

def factorial(n):
    if n==0:
        return 1
    else:
        return n*factorial(n-1)



def choose(n,m):
    if n < m:
        raise ValueError("n is less than m!")
    if m < 0:
        raise ValueError("m cannot be negative!!")
    else:
        return int(factorial(n)/factorial(m)/factorial(n-m))


def combn(x, m, FUN = None):
    import numpy as np
    if not isinstance(m,int):
        raise ValueError("m must be a single integer")

    if isinstance(x, int)  and x > 0:
      x = np.arange(1, x+1)

    n, x, e, h, a, nofun = len(x), np.array(x), 0, m, np.arange(1,m+1), FUN==None

    if not nofun and not callable(FUN):
        raise TypeError("'FUN' must be a function or None")

    if (nofun):r = x[a-1] 
    else: r = FUN(x[a-1])   
    out = [None] * choose(n, m)
    out[0] = r

    if m > 0:  
        i = 2
        nmmp1 = n - m + 1
        while a[0] != nmmp1:
          if e < n - h:
            h, e, j = 1, a[m-1], 1
          else:
            e = a[m - h-1]
            h += 1
            j = np.arange(1,h+1)

          a[m - h + j-1] = e + j
          if (nofun): r = x[a-1]
          else: r = FUN(x[a-1])
          out[i-1] = r
          i += 1
    return out

Вы можете сохранить это для использования в будущем: Теперь после этого вы можете делать любые комбинации, которые хотите:

 combn(4,3)
Out[854]: [array([1, 2, 3]), array([1, 2, 4]), array([1, 3, 4]), array([2, 3, 4])]

combn([1,2,3,4],3)
Out[855]: [array([1, 2, 3]), array([1, 2, 4]), array([1, 3, 4]), array([2, 3, 4])]

 combn([1,2,3,4],3,sum)
Out[856]: [6, 7, 8, 9]

В вашем случае вы могли бы сделать:

array1 = [1,2,np.nan,4,5]
array2 = [5,4,3,2,1]
array3 = [2,4,6,8,10]

combn([array1,array2,array3],2,lambda x: x[0]-x[1])
Out[859]: 
[array([-4., -2., nan,  2.,  4.]),
 array([-1., -2., nan, -4., -5.]),
 array([ 3.,  0., -3., -6., -9.])]

Теперь запустите тот же код с lambda x:x[1]-x[0], что даст вам все комбинации, которые вы хотите.

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