2016-12-08 6 views
2

レッツを使用してnumpyの配列を作成します。私は2つのnumpyのアレイarr1arr2を持っていると言う:リスト内包に

arr1 = np.random.randint(3, size = 100) 

arr2 = np.random.randint(3, size = 100) 

私は共同出現数を含むマトリックスを構築したいと思います。 つまり、arr1のすべての値が0である場合、同じ位置にあるarr2の要素も0であることがわかります。 p(0,0)arr2arr1と0で0で出現回数を表します

M = [[p(0,0), p(0,1), p(0,2)], 
    [p(1,0), p(1,1), p(1,2)], 
    [p(2,0), p(2,1), p(2,2)]] 

:だから、私は次の行列を取得したいと思います。

最初の試行:私は次のことを試してみました最初の試みとして

[[sum(arr1[arr2 == y] == x) for x in np.arange(0,3)] for y in np.arange(0,3)] 

しかし、Pythonは、次のエラーがスローされます。

NameError: name 'arr1' is not defined 

第二の試み:

私はforループを使用することによって、このエラーを掘り下げることを試みた。この場合、Pythonは、前のエラーをスローしませんが、代わりに3×3アレイを得るための、私は1x9の配列を取得

M = np.array([]) 

for x in np.arange(0,dim): 
    result = np.array([]) 

    for y in np.arange(0,dim): 
     result_temp = sum(arr1[arr2 == x] == y) 
     result = np.append(result, result_temp) 

    M = np.append(M,result) 

、および私は希望の3x3配列を得ることができません。

ありがとうございます。

答えて

3

あなたの最初のリストの理解が機能します。

import numpy as np 
np.random.seed(2016) 
arr1 = np.random.randint(3, size = 100) 
arr2 = np.random.randint(3, size = 100) 
result = [[sum(arr1[arr2 == y] == x) for x in np.arange(0,3)] 
      for y in np.arange(0,3)] 
print(result) 
# [[10, 9, 10], [8, 13, 15], [18, 8, 9]] 

をしかし、あなたは代わりにnp.histogram2d使用することができます:arr1が定義されている場合は、NameErrorを取得することはありません、私はnp.bincountを提案したいと思います

result2, xedges, yedges = np.histogram2d(arr2, arr1, bins=range(4)) 
print(result2) 

利回りのパフォーマンスを得るために

[[ 10. 9. 10.] 
[ 8. 13. 15.] 
[ 18. 8. 9.]] 
+0

ありがとう!私は 'arr1'を定義しましたが、まだエラーを投げますので、私はあなたの2番目の解決策を使用するつもりです。私はなぜなのか理解していない。 –

2

を、 -

N = 3 # Number of integers to cover 
out = np.bincount(arr2*N + arr1, minlength=N*N).reshape(N,N) 

サンプル実行 - あなたは答えるため

In [50]: arr1 = np.random.randint(3, size = 100) 
    ...: arr2 = np.random.randint(3, size = 100) 
    ...: 

In [51]: N = 3 # Number of integers to cover 

In [52]: np.bincount(arr2*N + arr1, minlength=N*N).reshape(N,N) 
Out[52]: 
array([[12, 10, 12], 
     [ 7, 6, 20], 
     [ 5, 13, 15]])