2016-12-26 155 views
0

我想使3维数组的所有元素为零而不调用三个for循环。python:使3维列表元素值全部为零

list= [[[1,2],[3,4,11]],[[5,6,12,13],[7,8,14]]] 

list= [[[0,0],[0,0,0]],[[0,0,0,0],[0,0,0]]] 

我不想叫3 for循环做个人作业。 是否有单一功能来执行此操作。

+0

好像你实际上已经回答了你自己的问题。 – DeepSpace

回答

1

在纯python中,你必须循环。但是,如果你可以使用另一个数字图书馆,你可以使用numpy

In [13]: arr = np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) 

In [15]: arr = np.zeros(arr.shape) 

In [16]: arr 
Out[16]: 
array([[[ 0., 0.], 
     [ 0., 0.]], 

     [[ 0., 0.], 
     [ 0., 0.]]]) 

正如评论所说,如果你想改变就地的项目,你最好使用一个简单的切片分配@ Blckknght,而不是创建新阵列使用np.zeros()

In [4]: arr[:] = 0 

In [5]: arr 
Out[5]: 
array([[[0, 0], 
     [0, 0]], 

     [[0, 0], 
     [0, 0]]]) 
+0

这个问题*特别关于列表*。 –

+1

请注意,如果您可以使用numpy并且希望在适当位置修改数组(而不是创建新数组并替换原始数组),则只需要一个切片分配:'arr [:] = 0'。如果您希望显式地表示您想要在所有维上进行广播,而不是仅在第一个维上进行广播('arr [...] = 1),则还可以使用'...'(使用隐含的Python单例'Ellipsis'的文字) 0')。 – Blckknght

+1

@ juanpa.arrivillaga:当有人询问如何一次对嵌套的数字数据结构进行一些操作时,我会说“使用numpy”通常是最正确的答案。它可能会或可能不适用于此,具体取决于提问者的真实数据在某些维度中是否具有不匹配的列表长度。 – Blckknght

1

您可以使用列表理解:

[[[0 for k in m] for m in l] for l in lst] 
+1

我已经将'list'重命名为'lst',因为Python本机类​​型之一已经被称为此名称。 –

+0

列表理解是循环语法糖 – abukaj