我希望有人可以帮我解决以下问题。
我有2个数组列表,它们应该相互链接。每个列表代表某个对象。 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])]
数组彼此链接,如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]])
如何链接这两个数组列表并以所需格式重新整形,如上例所示?
非常感谢!
答案 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
方法更快。只要列数远远大于行数,它就应该保持竞争力。