给定两个数组A和B,如何有效地组合它们,使得输出是一个数组,其中每个元素都是一个元组(Aij,Bij)?)

问题描述 投票:0回答:3

考虑两个数组 A 和 B,维度均为 NxN。 我希望生成一个新数组 NxN,这样每个新元素都是类型 (A_ij,B_ij) 的元组(或列表,并不重要)。

我可以通过逐个元素运行来做到这一点,例如:

def recombine(A,B):
    NewArray=[]
    for i in range(len(A)):
        NewArray.append([])
        for j in range(len(B)):
            NewArray[i].append(A[i][j],B[i][j])
    return NewArray

这是一个非常消耗内存的算法。

我想知道是否有更有效的方法(利用 numpy 数组来做到这一点)。

为了澄清这一点,让我们考虑以下示例(为了简单起见,我考虑使用简单列表而不是 np 数组):

A=[[1,2],[3,4]]
B=[[10,20],[30,40]]

#I want an output in the form:

[[(1,10),(2,20)],[(3,30),(4,40)]]
python numpy numpy-ndarray memory-efficient
3个回答
1
投票

我认为np.dstack可以在这种情况下使用,但是。如果您不想使用外部库,可以使用内置的 zip 函数。理论上,性能应该相对相同

O(n*n)
,因为你必须迭代二维数组中的所有元素来生成新数组,但由于内存、局部性优化,numpy 应该稍微更高效

A=[[1,2],[3,4]]
B=[[10,20],[30,40]]

def recombine(A,B):
    return [list(zip(A[i], B[i])) for i in range(len(A))]

print(recombine(A,B))
import numpy as np

print(np.dstack((A,B)))

0
投票
import numpy as np

A = np.array([[1, 2], [3, 4]])
B = np.array([[10, 20], [30, 40]])

def combine(A, B):
    result_array = np.dstack((A, B))
    return [[tuple(pair) for pair in row] for row in result_array]

print(combine(A, B)) 

0
投票

您可以使用嵌套

zip
zip
从一组可迭代对象中生成元组,其中元组中的每一项依次是每个可迭代对象的下一个值。首先,您压缩
A
B
,这会在
A
B
中生成子列表,然后再进行第二次压缩以翻转它们。

>>> A=[[1,2],[3,4]]
>>> B=[[10,20],[30,40]]
>>> [list(zip(*zipped)) for zipped in zip(A,B)]
[[(1, 10), (2, 20)], [(3, 30), (4, 40)]]
© www.soinside.com 2019 - 2024. All rights reserved.