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 回答