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

时间:2016-09-07 14:02:34

标签: python arrays numpy

我希望有人可以帮我解决以下问题。 我有2个数组列表,它们应该相互链接。每个列表代表某个对象。 arr1arr2是该对象的属性。 例如:

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])]

数组彼此链接,如1中的arr1,第一个数组属于20第一个数组中的arr2。我在这个例子中寻找的结果将是一个大小为3,4的numpy数组。 '列'代表0,1,2,3(arr1中的数字加0),行用arr2的相应值填充。如果没有相应的值,则此单元格应为0。 例如:

array([[ 0, 20, 50, 30],
       [ 0, 50, 50,  0],
       [ 0,  0, 75, 25]])

如何链接这两个数组列表并以所需格式重新整形,如上例所示?

非常感谢!

3 个答案:

答案 0 :(得分:3)

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

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)

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

答案 1 :(得分:1)

这是一个带有for循环的解决方案。详细展示每一步。

o.a.s.ml

答案 2 :(得分:0)

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

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's方法更快。只要列数远远大于行数,它就应该保持竞争力。