按行填充numpy数组

时间:2016-11-28 06:07:41

标签: python python-3.x numpy

如何按行填充numpy数组?

例如arr=np.zeros([3,2]). 我希望用list = [1,2].

替换每一行

所以输出是:

[1 2 
 1 2
 1 2]

我可以手工制作

for x in arr[:]:
    arr[:]=[1,2]

但我相信有更快的方法。

对不起,请看编辑: 假设,我们有:

arr=array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

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

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

我希望arr [1]数组填充[1,2],如下所示:

arr=array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 1.,  1.,  1.],
        [ 2.,  2.,  2.]],

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

2 个答案:

答案 0 :(得分:2)

你的循环是没有必要的。

利用broadcasting,您可以通过一项任务来完成此任务:

arr[:] = [1,2]

Numpy将右侧阵列广播到可分配给左侧的形状。

关于第二个问题(在您的更新中),您可以:

arr.T[..., 1] = [1,2]

答案 1 :(得分:0)

在这种情况下,对整个数组的简单分配起作用:

In [952]: arr=np.zeros((3,2),int)
In [953]: arr[...]=[1,2]
In [954]: arr
Out[954]: 
array([[1, 2],
       [1, 2],
       [1, 2]])

那是因为列表转换为(2,)数组,可以广播到(1,2)然后(3,2),以匹配arr

In [955]: arr[...]=np.array([3,2])[None,:]
In [956]: arr
Out[956]: 
array([[3, 2],
       [3, 2],
       [3, 2]])

如果我想按列设置值,我还需要做更多的工作

In [957]: arr[...]=np.array([1,2,3])[:,None]
In [958]: arr
Out[958]: 
array([[1, 1],
       [2, 2],
       [3, 3]])

我必须明确地创建一个(3,1)数组,它广播到(3,2)。

=================

我已经回答了您修改后的问题:

In [963]: arr[1,...]=np.array([1,2])[:,None]
In [964]: arr
Out[964]: 
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 1.,  1.,  1.],
        [ 2.,  2.,  2.]],

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

=================

tile添加到您的工具包中:

In [967]: np.tile([1,2],(3,1))
Out[967]: 
array([[1, 2],
       [1, 2],
       [1, 2]])
In [968]: np.tile([[1],[2]],(1,3))
Out[968]: 
array([[1, 1, 1],
       [2, 2, 2]])