结合numpy阵列和重塑列表

问题描述:

我希望有人能帮助我以下。 我有2个数组列表,应该链接到彼此。每个列表代表一个特定的对象。 arr1arr2是该对象的属性。 例如:结合numpy阵列和重塑列表

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

的阵列被彼此连接,如在arr11,第一阵列属于20arr2第一阵列。在这个例子中我要找的结果是一个大小为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

'arr1'中没有数字'0'。 – Dschoni

+0

@Dschoni问题是:'当没有相应的值时,这个单元应该是0。 – Divakar

+0

@Divakar:问题说:“列代表0,1,2,3(arr1中的数字)” – Dschoni

这里是一个几乎*量化方法 -

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) 

*:因为在开始循环理解的差不多了,但应该是微不足道的计算,因为它不涉及任何计算存在。

+0

工程就像一个魅力!快速和整洁的代码,太棒了! – cf2

+0

@ cf2没问题!也许编辑这个问题来澄清'arr1'中'0'的疑问? – Divakar

+0

好点。希望现在一切都清楚。再次感谢! – cf2

这是一个带for-loops的解决方案。详细显示每一步。

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] 
+0

感谢您显示每一步的详细信息。很有用! – cf2

这是一个简单的方法,只有一个级别的迭代:

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方法。只要列数比行数大得多,它就应该保持竞争力。