У меня есть 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, существует ли вообще способ сделать это на основе линейной алгебры? И как мне заставить программу называть массивы за меня?
Этот вопрос вроде бы спрашивает нечто подобное, но я не понимаю ответа.
Я просто хочу вернуться назад по списку массивов. Думаю, массивы [:: - 1] подойдут лучше. Я обновлю.
Что значит name_of_array1? Что бы вы хотели сделать, когда скажете array1 - array2 - поэлементное вычитание? Можете ли вы обновить свой пост, добавив урезанный образец ввода и образец вывода?
1_2 и т. д. Не являются действительными идентификаторами Python. Вы просто не можете назвать переменные, которые
@MadPhysicist да, вы совершенно правы; это просто идентификаторы, которые я привожу в качестве примеров. Я обновлю свой вопрос.
Очень новичок - хотеть иметь отдельную именованную переменную для всего. Гораздо лучше выбрать подходящую структуру данных для управления вашими данными. Здесь бы неплохо было бы dict или даже 3D-матрицу. Я был бы рад опубликовать либо в ответе, если вы не настроены на именованные переменные



Это обобщенный код, который работает с любой функцией: вы можете просмотреть его, чтобы понять, но он делает именно то, что вы хотите:
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], что даст вам все комбинации, которые вы хотите.
Вы манипулируете массивом, пока внешний цикл for выполняет итерацию по нему. Кроме того,
.reverse()не возвращает массив, что означает, что внутренний цикл for, вероятно, завершится ошибкой. Вы, вероятно, захотите использоватьreversed(arrays)илиarrays[::-1], если хотите получить копию перевернутого списка.