2016-03-24 12 views
2

numpy配列に集約を適用したい。numpy - 配列の各行に集約を適用する

x = np.array([ ([[ 1.87918162, 1.12919822, -1.63856741],\ 
     [ 0.40560484, 0.96425656, 0.7847214 ],\ 
     [-0.83472207, 0.88918246, -0.83298299],\ 
     [-1.29211004, 0.71730071, -2.09109609],\ 
     [-1.65800248, 0.49154087, 0.14932455]]),\ 
([[ 1.87918162, 1.12919822, -1.63856741],\ 
     [-0.21786626, -0.23561859, -0.19750753],\ 
     [-0.83472207, 0.88918246, -0.83298299],\ 
     [-0.34967282, 0.51348973, -0.30882943],\ 
     [ 0.35654636, -0.64453956, -1.3066075 ],\ 
     [ 0.187328 , -1.32496725, -0.05783984]])]) 
print type(x) 
print x[0] 
print np.mean(x[0], axis=0) 
print np.mean(x, axis=0) 

>>> <type 'numpy.ndarray'> 
>>> [[1.87918162, 1.12919822, -1.63856741], [0.40560484, 0.96425656, 0.7847214], [-0.83472207, 0.88918246, -0.83298299], [-1.29211004, 0.71730071, -2.09109609], [-1.65800248, 0.49154087, 0.14932455]] 
>>> [-0.30000963 0.83829576 -0.72572011] 

、エラーがある:

TypeError: unsupported operand type(s) for /: 'list' and 'long' 

、それは全体のアレイ上の1行のために働いていないが、なぜ私は理解していません。私は配列の形の不規則さが問題を引き起こすと思う。
しかし、どのようにして、配列のforループを使って反復せずに処理し、すべての結果を1つの配列に連結できますか?

EDIT

期待される結果は上下各列の和です。したがって、結果は次元の配列でなければなりません(2,3)。

+0

構造は実際に少し奇妙です。混合インデックス3次元構造のように見えます。正確に集計したいものは何ですか?あるいは別の言い方をすると、結果はどのようなものになると思いますか? – Spinor8

答えて

2

入力はNumPyの配列datatype = Objectであり、不自然なデータ形式なので、np.mean(x, axis=0)のようなものは使用できません。そのような場合の代わりに、これらの行を垂直に積み重ねて、の各要素の長さの末尾がaxis=0になるまで、np.add.reduceatを使用して合計削減を実行できます。したがって、我々のようなので、(私たちはループの理解とxの各要素の長さを取得しているが、それは計算集約的ではない、ほぼので)ほとんどベクトル化のアプローチを持っているでしょう -

lens = np.array([len(i) for i in x]) 
cut_idx = np.append(0,lens[:-1]).cumsum() 
out = np.add.reduceat(np.vstack(x),cut_idx,axis=0)/lens[:,None] 

をここでサンプル実行です質問に記載されているサンプル入力の拡張版の場合 -

In [89]: x = np.array([ ([[ 1.87918162, 1.12919822, -1.63856741],\ 
    ...:  [ 0.40560484, 0.96425656, 0.7847214 ],\ 
    ...:  [-0.83472207, 0.88918246, -0.83298299],\ 
    ...:  [-1.29211004, 0.71730071, -2.09109609],\ 
    ...:  [-1.65800248, 0.49154087, 0.14932455]]),\ 
    ...: ([[ 1.87918162, 1.12919822, -1.63856741],\ 
    ...:  [-0.21786626, -0.23561859, -0.19750753],\ 
    ...:  [-0.83472207, 0.88918246, -0.83298299],\ 
    ...:  [-0.34967282, 0.51348973, -0.30882943],\ 
    ...:  [ 0.35654636, -0.64453956, -1.3066075 ],\ 
    ...:  [ 0.187328 , -1.32496725, -0.05783984]]),\ 
    ...: ([[ 1.87918162, 1.12919822, -1.63856741],\ 
    ...:  [-1.29211004, 0.71730071, -2.09109609],\ 
    ...:  [-1.65800248, 0.49154087, 0.14932455]])  
    ...:  ]) 

In [90]: np.mean(x[0], axis=0) 
Out[90]: array([-0.30000963, 0.83829576, -0.72572011]) 

In [91]: np.mean(x[1], axis=0) 
Out[91]: array([ 0.17013247, 0.0544575 , -0.72372245]) 

In [92]: np.mean(x[2], axis=0) 
Out[92]: array([-0.35697697, 0.7793466 , -1.19344632]) 

In [93]: out 
Out[93]: 
array([[-0.30000963, 0.83829576, -0.72572011], 
     [ 0.17013247, 0.0544575 , -0.72372245], 
     [-0.35697697, 0.7793466 , -1.19344632]])