1

2D配列の値とリストを照合して、2D配列のリストとそれに対応する値を含む新しい2D配列を作成しようとしています。おそらく英語よりもコードで理解しやすいです...

import numpy as np

m_out = np.arange(50).reshape(25,2)
m_out_list = list(m_out[:,1])

eqn_out = range(7,17)

c_list = [(x,y) for x in eqn_out for y in m_out[:,0] if x in (m_out_list)]

print c_list

このコードは私が期待する答えを生み出します、

[(7, 0), (7, 2), (7, 4), (7, 6), ...

しかし、それは私が達成しようとしていることではありません。リスト内包表記の最後の部分(または機能する他のメソッド)で実行したいのは、eqn_outリストを対応する一意の元の値と一致させる配列を提供することです。すなわち

[(7,6), (9,8), (11,10), (13,12), (15,14), (17,16)]

これを正確に行う方法がわかりません。提案をいただければ幸いです。

4

2 に答える 2

3

そんな感じ:

[(j, i) for (i,j) in m_out if j in eqn_out]

うまくいくようです。m_outただし、サブセットではなく全体を反復処理しているため、おそらく少し無駄です。

別の方法は次のとおりです。

test = reduce(np.logical_or,v(m_out[:,1]==i for i in eqn_out))
[(j,i) for (i,j) in m_out[test]]

ここでは、len(eqn_out)ブール配列を繰り返し処理しており、を1つにまとめていますreduce(np.logical_or, ...)。このブール配列を使用して、必要なアイテムを選択しますm_out。2番目の列の要素を最初に配置する必要があるため、最後のリスト内包表記を使用する必要があります。

少なくとも2Nのブール配列を作成する必要があることに注意してください。これは、最初のソリューションよりもさらに無駄になる可能性があります...ただし、どちらのソリューションも2より多くの列に簡単に適用できます。

于 2012-09-03T23:18:45.837 に答える
3

[より単純なアプローチを最優先するように編集されました。]

実際には、私はおそらく次のことを行います。

In [166]: d = dict(m_out[:,::-1])
In [167]: [(k, d[k]) for k in eqn_out if k in d]
Out[167]: [(7, 6), (9, 8), (11, 10), (13, 12), (15, 14), (17, 16)]

しかし、楽しみのために、ゴツゴツしたままで、次のようなものはどうですか?

[更新:より良いnumpyメソッド]:

In [15]: m_out[np.in1d(v, eqn_out)][:, ::-1]
Out[15]: 
array([[ 7,  6],
       [ 9,  8],
       [11, 10],
       [13, 12],
       [15, 14],
       [17, 16]])

または私の元の厄介なアプローチ:

In [150]: import numpy as np
In [151]: m_out = np.arange(50).reshape(25,2)   
In [152]: v = m_out[:,1]    
In [153]: eqn_out = np.arange(7, 18)     
In [154]: eqn_out
Out[154]: array([ 7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17])

私たちが知っている値だけを保持します:

In [155]: np.intersect1d(eqn_out, v)
Out[155]: array([ 7,  9, 11, 13, 15, 17])

それらがどこにあるかを見つけます(データがソートされていると仮定します!!):

In [156]: v.searchsorted(np.intersect1d(eqn_out, v))
Out[156]: array([3, 4, 5, 6, 7, 8])

選択の目的でこれらのインデックスを使用します。

In [157]: m_out[v.searchsorted(np.intersect1d(eqn_out, v))]
Out[157]: 
array([[ 6,  7],
       [ 8,  9],
       [10, 11],
       [12, 13],
       [14, 15],
       [16, 17]])

フリップ:

In [158]: m_out[v.searchsorted(np.intersect1d(eqn_out, v))][:,::-1]
Out[158]: 
array([[ 7,  6],
       [ 9,  8],
       [11, 10],
       [13, 12],
       [15, 14],
       [17, 16]])
于 2012-09-03T23:23:17.000 に答える