Python 合并numpy数组列表并重塑形状

Python 合并numpy数组列表并重塑形状,python,arrays,numpy,Python,Arrays,Numpy,我希望任何人都能在以下方面帮助我。 我有两个数组列表,它们应该相互链接。每个列表代表一个特定的对象arr1和arr2是该对象的属性。 例如: import numpy as np arr1 = [np.array([1, 2, 3]), np.array([1, 2]), np.array([2, 3])] arr2 = [np.array([20, 50, 30]), np.array([50, 50]), np.array([75, 25])] 这些数组相互链接,如在arr1中的1中,第

我希望任何人都能在以下方面帮助我。 我有两个数组列表,它们应该相互链接。每个列表代表一个特定的对象
arr1
arr2
是该对象的属性。 例如:

import numpy as np

arr1 = [np.array([1, 2, 3]), np.array([1, 2]), np.array([2, 3])]
arr2 = [np.array([20, 50, 30]), np.array([50, 50]), np.array([75, 25])]
这些数组相互链接,如在
arr1
中的
1
中,第一个数组属于
arr2
中的
20
。我在本例中寻找的结果是大小为3,4的numpy数组。“columns”代表0、1、2、3(arr1中的数字加上0),行中填充了arr2的相应值。当没有相应的值时,此单元格应为0。 例如:

array([[ 0, 20, 50, 30],
       [ 0, 50, 50,  0],
       [ 0,  0, 75, 25]])
如何将这两个数组列表链接起来,并按照上面示例中所示的所需格式对它们进行重塑


非常感谢

这是一种几乎矢量化的方法-

lens = np.array([len(i) for i in arr1])

N = len(arr1)
row_idx = np.repeat(np.arange(N),lens)
col_idx = np.concatenate(arr1)

M = col_idx.max()+1
out = np.zeros((N,M),dtype=int)
out[row_idx,col_idx] = np.concatenate(arr2)

*:几乎是因为开始时循环理解,但这在计算上可以忽略不计,因为它不涉及任何计算。

这里有一个for循环的解决方案。详细显示每个步骤

import numpy as np

arr1 = [np.array([1, 2, 3]), np.array([1, 2]), np.array([2, 3])]
arr2 = [np.array([20, 50, 30]), np.array([50, 50]), np.array([75, 25])]

maxi = []
for i in range(len(arr1)):
    maxi.append(np.max(arr1[i]))
maxi = np.max(maxi)
output = np.zeros((len(arr2),maxi))
for i in range(len(arr1)):
    for k in range(len(arr1[i])):
        output[i][k]=arr2[i][k]

这是一种直接的方法,只有一个迭代级别:

In [261]: res=np.zeros((3,4),int)
In [262]: for i,(idx,vals) in enumerate(zip(arr1, arr2)):
     ...:     res[i,idx]=vals
     ...:     
In [263]: res
Out[263]: 
array([[ 0, 20, 50, 30],
       [ 0, 50, 50,  0],
       [ 0,  0, 75, 25]])

对于这个例子,我怀疑它比Divakar的方法更快。只要列的数量比行的数量大一点,它就应该保持竞争力。

arr1
@Dschoni中没有数字
0
。问题说明:
当没有相应的值时,这个单元格应该是0
@Divakar:问题说明:“列代表0,1,2,3(arr1中的数字)“@Dschoni-Hmm,这应该是一个打字错误。很好的回答!感谢您显示每个步骤的详细信息。非常有用!@cf2没问题!也许可以编辑问题以澄清
arr1
中关于
0
的疑问?