for循环中不同大小的数组上的函数

时间:2019-03-22 19:09:30

标签: python arrays

我有两个不同大小的数组,我想在for循环中执行逻辑功能。例如,如果我有:

array1 = [6,7,8]
array2 = [1,2,3,4,5]

我想对array1的每个元素减去array2的每个元素,以获得

[6-1,6-2,6-3,6-4,6-5],[7-1,7-2,7-3,7-4,7-5],[8-1,8-2,8-3,8-4,8-5]

这是从array1的每个元素中减去array2的每个元素

所以我试图做一个for循环,如:

for i in range(len(array1)):
    ar = array1[i]-array2

还有

for i in range(len(array1)):
    for j in range(len(array2)):
        ar = array1[i]-array2[j]

但是这些似乎都不起作用

第一种方法似乎是返回正确形状的数组,但肯定不是正确的值。

我希望它以单独的数组返回,因为实际上,我的样本量很大。

7 个答案:

答案 0 :(得分:4)

我们可以使用itertools.product

解决此问题
from itertools import product
from operator import sub

final = []
for item in array1:
    prods = product([item], array2)
    subs = [sub(*p) for p in prods]
    final.append(subs)

print(final)
# [[5, 4, 3, 2, 1], [6, 5, 4, 3, 2], [7, 6, 5, 4, 3]]

product是如何工作的,以元组的形式返回两个数组的笛卡尔积,所以:

(6, 1), (6, 2), etc....

然后,我们使用列表理解将sub函数简单地应用于每个元组。

答案 1 :(得分:3)

以下解决方案应使用列表理解:

result = []
for value1 in array1:
    result.append([value1 - value2 for value2 in array2])

您甚至可以将两个for循环都用于列表理解,写成一行:

result = [[value1 - value2 for value2 in array2] for value1 in array1]

答案 2 :(得分:2)

循环解决方案:

array1 = [6, 7, 8]
array2 = [1, 2, 3, 4, 5]

arr = []
for i in array1:
    tmp = []
    for j in array2:
        tmp.append(i - j)
    arr.append(tmp)

print(arr)

输出:

  

[[5、4、3、2、1],[6、5、4、3、2],[7、6、5、4、3]]

答案 3 :(得分:2)

您的for循环几乎是正确的,除了,您每次迭代都会覆盖ar的值(并使范围变得稍微复杂一些)

您可以通过列表理解来实现

[[i - j for j in array2] for i in array1]
# [[5, 4, 3, 2, 1], [6, 5, 4, 3, 2], [7, 6, 5, 4, 3]]

答案 4 :(得分:1)

您在正确的轨道上,但是您已切换阵列。您希望内部循环内的array1执行您要执行的操作:

array1 = [6,7,8]
array2 = [1,2,3,4,5]
finalarray=[]

for i in range(len(array2)):
    for j in range(len(array1)):
        ar = array1[j]-array2[i]
        finalarray.append(ar)

print(finalarray)

>>>[5, 6, 7, 4, 5, 6, 3, 4, 5, 2, 3, 4, 1, 2, 3]

答案 5 :(得分:1)

ar在您的代码中未得到正确处理,它必须是一个数组数组(矩阵),并且您需要另一个变量来保存每次迭代的结果,这可能是一种更好的方法使用列表推导,但这是一种方法:

array1 = [6,7,8]
array2 = [1,2,3,4,5]

ar = []
row = []
for i in range(len(array1)):
    for j in range(len(array2)):
        row.append(array1[i]-array2[j])
    ar.append(row)
    row = []
print ar

答案 6 :(得分:1)

这里有很多好的答案,但是另一个对大型数组特别有用的选择是使用numpy,这是一个用于有效移动大型数字数组的软件包。 numpy中一个可能的答案是:

import numpy as np

array1 = np.arange(6,9)                       # make arrays 1 and 2
array2 = np.arange(1,6)
output = (array1.repeat(array2.shape[0])      # repeat array1 as many times as there are elements in array2
                .reshape(array1.shape[0], -1) # reshape so we have a row for each element in array1
         ) - array2                           # subtract array2 from each row
output
array([[5, 4, 3, 2, 1],
       [6, 5, 4, 3, 2],
       [7, 6, 5, 4, 3]])