首页 > 解决方案 > 将 1d numpy ndarray 分配到 2d 数组的列中

问题描述

假设dst是一个形状为(5,N)ramp的ndarray,并且是一个形状为(5,)的ndarray。(在这种情况下,N = 2):

>>> dst = np.zeros((5, 2))
>>> dst
array([[0., 0.],
       [0., 0.],
       [0., 0.],
       [0., 0.],
       [0., 0.]])
>>> ramp = np.linspace(1.0, 2.0, 5)
>>> ramp
array([1.  , 1.25, 1.5 , 1.75, 2.  ])

现在我想将 ramp 复制到 dst 的列中,结果如下:

>>> dst
array([[1., 1.],
       [1.25., 1.25.],
       [1.5., 1.5.],
       [1.75, 1.75],
       [2.0, 2.0]])

我没想到这会起作用,而且它不会:

>>> dst[:] = ramp
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (5) into shape (5,2)

这行得通,但我确信有一种更“numpyesque”的方式来实现这一点:

>>> dst[:] = ramp.repeat(dst.shape[1]).reshape(dst.shape)
>>> dst
array([[1.  , 1.  ],
       [1.25, 1.25],
       [1.5 , 1.5 ],
       [1.75, 1.75],
       [2.  , 2.  ]]) 

有任何想法吗?

笔记

“克隆”行或列向量不同,我想分配rampdst(甚至是的子集dst)。此外,那里给出的解决方案使用 python 数组作为源,而不是 ndarray,因此需要调用 .transpose 等。

标签: pythonarraysnumpy

解决方案


方法1:使用广播:

正如评论中提到的OP。广播也适用于分配

dst[:] = ramp[:,None]

方法2:使用column_stack

N = dst.shape[1]
dst[:] = np.column_stack([ramp.tolist()]*N)

Out[479]:
array([[1.  , 1.  ],
       [1.25, 1.25],
       [1.5 , 1.5 ],
       [1.75, 1.75],
       [2.  , 2.  ]])

方法3:使用np.tile

N = dst.shape[1]
dst[:] = np.tile(ramp[:,None], (1,N))

推荐阅读