2017-12-13 36 views
2

私は、Python & numpyのに非常に新しいですし、以下を達成しようとしています:numpyの検索&スライス3Dアレイ

考えると、3次元アレイ:

arr_3d = [[[1,2,3],[4,5,6],[0,0,0],[0,0,0]], 
      [[3,2,1],[0,0,0],[0,0,0],[0,0,0]] 
      [[1,2,3],[4,5,6],[7,8,9],[0,0,0]]] 
arr_3d = np.array(arr_3d) 
  1. は、インデックスがどこ[0,0,0]現れゲット与えられた3D配列の中で。
  2. 最初に[0,0,0]が表示されている場所から所定の3D配列をスライスします。

つまり、私は与えられた3D配列からパディング(この場合は[0,0,0])を削除しようとしています。ここで

私が試したもので、

arr_zero = np.zeros(3) 
for index in range(0, len(arr_3d)): 
    rows, cols = np.where(arr_3d[index] == arr_zero) 
    arr_3d[index] = np.array(arr_3d[0][:rows[0]]) 

しかし、これをやって、私は次のエラー得続ける:

[[[1,2,3],[4,5,6]], 
[[3,2,1]] 
[[1,2,3],[4,5,6],[7,8,9]]] 
:私はこのような何かを期待してい

Could not broadcast input array from shape ... into shape ...

助けていただければ幸いです。

+0

質問を更新しましたcᴏʟᴅsᴘᴇᴇᴅ@。ありがとう! – user2004685

答えて

2

argmax()を伴って含むall()削減とそれらのインデックスの最初のoccuranceを取得し、その後3D配列オフ各2Dスライスをスライス -

In [106]: idx = (arr_3d == [0,0,0]).all(-1).argmax(-1) 

# Output as list of arrays 
In [107]: [a[:i] for a,i in zip(arr_3d,idx)] 
Out[107]: 
[array([[1, 2, 3], 
     [4, 5, 6]]), array([[3, 2, 1]]), array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]])] 

# Output as list of lists 
In [108]: [a[:i].tolist() for a,i in zip(arr_3d,idx)] 
Out[108]: [[[1, 2, 3], [4, 5, 6]], [[3, 2, 1]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]] 
+0

私の答えはあなたと非常によく似ていますが、あなたの方が良いです(削除されます)。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅそれほど似ていないので(あなたはそれを保つことができたかもしれません)、しかし、私はargmaxが速くなると思います。 – Divakar

+0

これは完璧に機能しました!どうもありがとうございます。 – user2004685