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

Python 初始化与数组形状相同的空列表,python,arrays,list,numpy,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.]]] 如何创建一个具有相同形状的空列表,其中每个

假设我有一个形状数组:

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

在上面所示的特定情况下,它看起来像:

[[[[], []]
  [[], []]
  [[], []]
  [[], []]],
 [[[], []]
  [[], []]
  [[], []]
  [[], []]],
 [[[], []]
  [[], []]
  [[], []]
  [[], []]]]
但我需要一种对任何形状的数组都有效的方法。是否有内置函数来执行此操作?

np。空(shape=(3,4,2,0))
可能就是您要查找的。或者更一般地说,
np.empty(shape=your_-shape+(0,)
,其中您的_-shape是一个类似于
(3,4,2)
的元组


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

np.empty(shape=your_shape+(0,).tolist()
除此之外,您还可以执行一个返回嵌套列表理解的包装函数:

a=[[[]范围(2)中的j]范围(4)中的i]范围(3)中的k]
如果您想要numpy阵列:

a=np.array(a)
这种功能可以是:

导入副本
def空(形状):
如果len(形状)==1:
对于范围内的i返回[](形状[0])]
项目=形状[0]
新闻形状=形状[1:]
子列表=空(新闻形状)
return[范围内i的copy.deepcopy(子列表)]
你会这样称呼它:

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

如果目标是一个多维数组,其中单个项是Python列表,那么我们需要小心不要生成一个维度为0的数组,或者只是一个深度嵌套的列表

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

In [58]: np.array([[],[]])
Out[58]: array([], shape=(2, 0), dtype=float64)
没有列表数据类型;最接近的是对象。生成对象数组最可靠的方法是将它们初始化为空,然后填充值:

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。这只是概念的证明


但是你关于迭代这样一个数组的另一个问题让我想知道访问这样一个数组是否比访问一个简单的列表更有效。但这一讨论可能属于另一个问题。

我没有投反对票,但我敢说原因:我正在寻找一种适用于任何形状阵列的通用解决方案。您的答案仅适用于问题中使用的示例数组。@Gabriel让我知道这是否是一个更好的答案。现在,要获得所需的列表列表,只需调用
tolist
方法:
np.empty(shape=a.shape+(0,).tolist()
@JulienSpronck您答案中的第一行不起作用,它们总是返回一个空列表。函数似乎有一些问题。首先,对
empty(newshape)
的调用是什么?这一点在任何地方都没有定义。它只是这个答案的一个改进。也许@JulienSpronck可以编辑它以包含使用
tolist()
。这似乎有两个问题。首先,额外的维度应该是
(1,)
。其次,
r.fill([])
用相同的列表填充每个单元格。这对我来说很有效(尽管不需要调用
r.fill([])
)。
r
的数据类型不相关。对我来说也很有用,不知道我以前是怎么得到一个空列表的。当你写“list”和
子列表时,你是指Python
列表
,还是numpy
数组
?您打算如何处理这些空的
子列表
?@hpaulj我指的是Python
列表
。在这个问题中,您可以看到我需要如何处理这些列表:
ValueError: could not broadcast input array from shape (0) into shape (3,4,2)