2016-09-07 23 views
2

私は次のことを誰かが助けてくれることを願っています。 私は2つの配列のリストを持っています。これらの配列はそれぞれ互いにリンクされていなければなりません。各リストは特定のオブジェクトを表します。 arr1およびarr2は、そのオブジェクトの属性です。例えば :アレイはarr11のように互いに連結されている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])] 

、最初の配列は20arr2における最初の配列に属します。私がこの例で探している結果は、サイズが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]]) 

どのように配列のこれら2つのリストを連結し、上記の例に示すように所望のフォーマットでそれらを再構築でしょうか?

多くの感謝!

+0

「arr1」に数字「0」はありません。 – Dschoni

+0

@Dschoni質問には、「対応する値がないときは、このセルは0でなければなりません。 – Divakar

+0

@Divakar:「列は0,1,2,3(数字はarr1の数字)」 – Dschoni

答えて

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) 

:ほぼので、スタート時のループの理解のが、それはそこに任意の計算を必要としないとして、それは、計算上無視できるはずです。

+0

魅力的な作品です!高速かつすっきりしたコード、素晴らしい! – cf2

+0

@ cf2問題ありません!おそらく 'arr1'の' 0'の疑いを明確にするために質問を編集するでしょうか? – Divakar

+0

良い点。すべてが今、明確であることを願っています。再度、感謝します! – cf2

1

ここでは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] 
+0

各ステップの詳細を表示していただきありがとうございます。非常に便利! – cf2

0

これは、反復の唯一のレベルで、簡単な方法である:私はそれは、この例の@Divakar'sアプローチよりも高速である疑いがある

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

。また、列の数が行の数よりかなり大きい場合は、競争力を維持する必要があります。

関連する問題