1

numpy 配列の初期化メソッドがどのように機能するかと同様に、任意のサイズのリストをオブジェクトで初期化する関数を実装しようとしています。

def fill(shape, object):

私はこれに頭を悩ませてきましたが、任意の長さの次元に対してこれを行う方法を考えることができません。ある種の再帰が必要になると思います。

望ましい動作の例を次に示します。簡単にするために、オブジェクトは浮動小数点数 0 だけですが、どのクラスでも動作させるにはこれが必要です。

> fill( (2, 3, 4), 0.)
[
 [[ 0.,  0.,  0.,  0.],
  [ 0.,  0.,  0.,  0.],
  [ 0.,  0.,  0.,  0.]]
,
 [[ 0.,  0.,  0.,  0.],
  [ 0.,  0.,  0.,  0.],
  [ 0.,  0.,  0.,  0.]]
]
4

2 に答える 2

5

次の再帰的な実装を試してください

def fill(shape,value):
    if not shape: return value
    return [fill(shape[1:],value) for i in range(shape[0])]

非再帰バージョン

import copy
def fill(shape,value):
    result=value
    for i in reversed(shape):
        result=[copy.deepcopy(result) for j in range(i)]
    return result
于 2012-04-19T15:29:50.030 に答える
-1

これには標準的なものは見られません。これは私の試みです- *args と **kwargs にも何かを追加できます

In [1]: def fill(dimensions,cls):
   ...:     size_list=[cls()]*dimensions[-1]
   ...:     for dimension in dimensions[:0:-1]:
   ...:         size_list=[size_list]*dimension
   ...:     return size_list
   ...: 

In [2]: print fill((2,3,4),float)
[[[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]]]
于 2012-04-19T15:27:58.260 に答える