Arrays 生成数组的组合
我有9个数组,我想处理它们以找到所有可能的组合,因此结果数组的名称告诉我哪些数组已经组合。例如:Arrays 生成数组的组合,arrays,python-3.x,list,numpy,Arrays,Python 3.x,List,Numpy,我有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 combineArra
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
,所以有没有线性代数类型的方法来实现这一点?如何让程序为我命名数组
似乎在问类似的问题,但我不明白答案。这是一个适用于任何函数的通用代码:您可以通过它来理解,但它确实满足了您的需要:
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
在您的情况下,您可以:
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循环可能会失败。如果您想获得反向列表的副本,可能需要使用反向(数组)
或数组[:-1]
。我只想反向遍历数组列表。我想数组[:-1]会工作得更好。我会更新的。你说的阵列名称是什么意思?当你说array1-array2
元素减法时,你想做什么?你能用精简的示例输入和示例输出更新你的帖子吗?1_2等不是有效的python标识符。您根本无法命名变量that@MadPhysicist是的,你说得很对;这些只是我作为示例输入的标识符。我会更新我的问题。
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.])]