2016-12-19 2 views
1

私はこれを見てきました:Slice 2d array into smaller 2d arrays2D配列を可変サイズのより小さい2D配列に分割するにはどうすればよいですか?

は、しかし、私は均等にN個のブロックによっていくつかNに分割することができないイメージがあります。理想的には、私が発生し、次の動作のためにたい:以下に(70x85)アレイを分割反映

>>> import numpy as np 
>>> a = np.arange(70*85).reshape([70,85]) 
>>> arrlist = split_2d(a, [16, 16]) 
>>> dd = dict() 
>>> for arr in arrlist: 
...  dd[arr.shape] = dd.get(arr.shape, 0) + 1 
>>> print(dd) 
    {(16, 16): 16, (10, 16): 4, (16, 5): 4, (10, 5): 1} 

(16x16) (16x16) (16x16) (16x16) (10x16) 
(16x16) (16x16) (16x16) (16x16) (10x16) 
(16x16) (16x16) (16x16) (16x16) (10x16) 
(16x16) (16x16) (16x16) (16x16) (10x16) 
(16x16) (16x16) (16x16) (16x16) (10x16) 
(16x5) (16x5) (16x5) (16x5) (10x5) 

戻り値は、2次元アレイのリストのいずれかとすることができます、または2D配列の2D配列。

+0

?そして、開始配列のインデックス上でのループ処理は十分ですか? –

+0

はい、2D配列の2D配列は問題ありません。そして、ループは大丈夫ですが、インプレースは最適です(画像がかなり大きくなるのを見てください) – ijustlovemath

答えて

1

これは必要なジェネレータを構築します。


from itertools import product 
import numpy as np 

n, m = 70, 85 
a = np.arange(n * m).reshape(n, m) 

def igen(a, n, m): 
    i_ = np.arange(a.shape[0]) // n 
    j_ = np.arange(a.shape[1]) // m 
    for i, j in product(np.unique(i_), np.unique(j_)): 
     yield (i, j), a[i_ == i][:, j_ == j] 

dict_of_arrays = dict(igen(a, 16, 16)) 
有する別の代替

np.nanパッドと reshape + transpose

def cover_multiple(current_length, multiple): 
    return ((current_length - 1) // multiple + 1) * multiple 

def slicer(a, chunk_i, chunk_j, two_d=True): 
    n = cover_multiple(a.shape[0], chunk_i) 
    m = cover_multiple(a.shape[1], chunk_j) 
    c = np.empty((n, m)) 
    c.fill(np.nan) 
    c[:a.shape[0], :a.shape[1]] = a 
    c = c.reshape(n // chunk_i, chunk_i, m // chunk_j, chunk_j) 
    c = c.transpose(0, 2, 1, 3) 
    if not two_d: 
     c = c.reshape(-1, chunk_i, chunk_j) 
    return c 

デモ

D配列の2次元配列を - あなたがしたいですか戻り値はどのような
a = np.arange(64).reshape(8, 8) 
a 

[[ 0 1 2 3 4 5 6 7] 
[ 8 9 10 11 12 13 14 15] 
[16 17 18 19 20 21 22 23] 
[24 25 26 27 28 29 30 31] 
[32 33 34 35 36 37 38 39] 
[40 41 42 43 44 45 46 47] 
[48 49 50 51 52 53 54 55] 
[56 57 58 59 60 61 62 63]] 

print(slicer(a, 3, 5)) 

[[[[ 0. 1. 2. 3. 4.] 
    [ 8. 9. 10. 11. 12.] 
    [ 16. 17. 18. 19. 20.]] 

    [[ 5. 6. 7. nan nan] 
    [ 13. 14. 15. nan nan] 
    [ 21. 22. 23. nan nan]]] 


[[[ 24. 25. 26. 27. 28.] 
    [ 32. 33. 34. 35. 36.] 
    [ 40. 41. 42. 43. 44.]] 

    [[ 29. 30. 31. nan nan] 
    [ 37. 38. 39. nan nan] 
    [ 45. 46. 47. nan nan]]] 


[[[ 48. 49. 50. 51. 52.] 
    [ 56. 57. 58. 59. 60.] 
    [ nan nan nan nan nan]] 

    [[ 53. 54. 55. nan nan] 
    [ 61. 62. 63. nan nan] 
    [ nan nan nan nan nan]]]] 
+0

どうすれば使用できますか?申し訳ありませんが、前に発電機を見たことはありません。 – ijustlovemath

関連する問題