2016-12-11 19 views
3
arr = [[1, 2, 4], [10, 3, 8], [16, 12, 13], [14, 4, 20]] 

numpyのおよび/またはパンダで私を助けてください、2Dリストを操作するために:numpyの - 2Dリストや印刷の上に反復処理(行、列)のインデックス

  1. すべてのユニークな組み合わせの合計を取得します。要素は同じ行から再度選択することなく。上記の配列には81個の組み合わせが必要です。
  2. 組み合わせの各要素の行、列を印刷します。

例:

(1,3,12,20)、合計= 36及び(行、列)=(0,0)、(1,1)、(2、 1、(3,2)]

(4,10,16,20)、合計= 50、(行、列)= [(0,2)、(1,0)、(2,0 )、(3,2)]

+0

'ループ。しかし、私はnumpy/pandaの高性能データ構造を使用する必要があります。私は多くのフォーラムを検索しましたが、要素のすべての組み合わせをループする方法を見つけることができませんでした。 – vkb

答えて

4

がアプローチ:ここitertools.productを使用してベクトル化アプローチだとarray-indexing -

from itertools import product 

a = np.asarray(arr) # Convert to array for ease of use and indexing 
m,n = a.shape 
combs = np.array(list(product(range(n), repeat=m))) 
out = a[np.arange(m)[:,None],combs.T].sum(0) 

サンプル実行 -

In [296]: arr = [[1, 2, 4], [10, 3, 8], [16, 12, 13], [14, 4, 20]] 

In [297]: a = np.asarray(arr) 
    ...: m,n = a.shape 
    ...: combs = np.array(list(product(range(n), repeat=m))) 
    ...: out = a[np.arange(m)[:,None],combs.T].sum(0) 
    ...: 

In [298]: out 
Out[298]: 
array([41, 31, 47, 37, 27, 43, 38, 28, 44, 34, 24, 40, 30, 20, 36, 31, 21, 
     37, 39, 29, 45, 35, 25, 41, 36, 26, 42, 42, 32, 48, 38, 28, 44, 39, 
     29, 45, 35, 25, 41, 31, 21, 37, 32, 22, 38, 40, 30, 46, 36, 26, 42, 
     37, 27, 43, 44, 34, 50, 40, 30, 46, 41, 31, 47, 37, 27, 43, 33, 23, 
     39, 34, 24, 40, 42, 32, 48, 38, 28, 44, 39, 29, 45]) 

メモリ効率的なアプローチ:ここでのアプローチは、すべてのそれらの組み合わせを作成し、代わりにオンザフライbroadcasted和使用せずに、だと哲学は非常にthis other postに触発された - 私は `通常のPythonを試してみました

a = np.asarray(arr) 
m,n = a.shape 
out = a[0] 
for i in range(1,m): 
    out = out[...,None] + a[i] 
out.shape = out.size # Flatten 
+0

パーフェクト、@Divakarありがとう – vkb

1

あなたがitertoolsからproduct機能を使用することができます。

小さいリストを持つ210

例:すべてのこのような組み合わせを作成し、合計し

arr = [[1,2],[3,4],[5,6]] 
[sum(p) for p in product(*arr)] 
# [9, 10, 10, 11, 10, 11, 11, 12] 
+0

ありがとう、それはその合計に到着するのに役立つ要素の(行、列)インデックスを印刷しません。どうすればいい? – vkb