初始化与数组具有相同形状的空列表

时间:2015-03-26 21:54:51

标签: python arrays list numpy

说我有一个形状数组:

import numpy as np
a = np.zeros(shape=(3, 4, 2))

看起来像:

print a

[[[ 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.元素都被一个空的子列表替换?

在上面显示的具体情况中,它看起来像:

[[[[], []]
  [[], []]
  [[], []]
  [[], []]],
 [[[], []]
  [[], []]
  [[], []]
  [[], []]],
 [[[], []]
  [[], []]
  [[], []]
  [[], []]]]

但是我需要一种适用于任何形状的数组的方法。是否有内置函数来执行此操作?

3 个答案:

答案 0 :(得分:3)

np.empty(shape=(3, 4, 2, 0))可能就是你要找的东西。或者更一般地,np.empty(shape=your_shape+(0,))其中your_shape是(3, 4, 2)之类的元组。

现在要获得所需的列表列表,您可以调用tolist方法:

np.empty(shape=your_shape+(0,)).tolist()

另外,你可以做一个返回嵌套列表推导的包装函数:

a = [[[[] for j in xrange(2)] for i in xrange(4)] for k in xrange(3)]

如果你想要一个numpy数组:

a = np.array(a)

这样的功能可能是:

def empty(shape):
    if len(shape) == 1:
        return [[] for i in xrange(shape[0])]
    items = shape[0]
    newshape = shape[1:]
    sublist = empty(newshape)
    return [sublist for i in xrange(items)]

你可以这样称呼它:

a = empty([3,4,2])

答案 1 :(得分:1)

>>> a = np.zeros(shape=(3, 4, 2))
>>> r = np.empty((a.shape) + (0, ), dtype=object)
>>> r.fill([])
>>> r.tolist()
[[[[], []], [[], []], [[], []], [[], []]], [[[], []], [[], []], [[], []], [[], []]], [[[], []], [[], []], [[], []], [[], []]]]

答案 2 :(得分:1)

如果目标是多维数组,其中各个项目是Python列表,我们需要注意不要生成具有0维度的数组,或者只是生成深度嵌套的列表列表。

一个问题是numpy很容易将列表(空或无)转换为数组。默认情况下,它会尝试创建尽可能高的维度数组。例如,

In [58]: np.array([[],[]])
Out[58]: array([], shape=(2, 0), dtype=float64)

没有列表dtype;最接近的是对象。生成对象数组的最可靠方法是将它们初始化为空,然后填充值:

In [54]: A = np.empty((3,4,2),dtype=object)

In [55]: A[0,0,0]=[] 

In [56]: A[:]=A[0,0,[0]]

In [57]: A
Out[57]: 
array([[[[], []],
        [[], []],
        [[], []],
        [[], []]],

       [[[], []],
        [[], []],
        [[], []],
        [[], []]],

       [[[], []],
        [[], []],
        [[], []],
        [[], []]]], dtype=object)

A[:]=[]不起作用,因为它将[]视为(0,)数组:

ValueError: could not broadcast input array from shape (0) into shape (3,4,2)

[0,0,0][0,0,[0]]的使用假设为3d,但可以通过更多的工作推广到nd。这只是概念证明。

但是关于迭代这样一个数组的另一个问题让我想知道访问这样一个数组是否与访问一个简单的列表列表相比。但也许这个讨论属于另一个问题。