用另一个数组填充numpy数组的列

时间:2013-09-12 09:03:08

标签: python arrays numpy

我有:

x = np.zeros((96,11,11,2,10),dtype=np.float64)
y = np.array([0,10,20,30,40,50,60,70,80,90,100],dtype=np.float64)
x[:,:,:,0,0] = y
print x[0,:,:,0,0]

我得到:

[[   0.   10.   20.   30.   40.   50.   60.   70.   80.   90.  100.]
 [   0.   10.   20.   30.   40.   50.   60.   70.   80.   90.  100.]
 [   0.   10.   20.   30.   40.   50.   60.   70.   80.   90.  100.]
 [   0.   10.   20.   30.   40.   50.   60.   70.   80.   90.  100.]
 [   0.   10.   20.   30.   40.   50.   60.   70.   80.   90.  100.]
 [   0.   10.   20.   30.   40.   50.   60.   70.   80.   90.  100.]
 [   0.   10.   20.   30.   40.   50.   60.   70.   80.   90.  100.]
 [   0.   10.   20.   30.   40.   50.   60.   70.   80.   90.  100.]
 [   0.   10.   20.   30.   40.   50.   60.   70.   80.   90.  100.]
 [   0.   10.   20.   30.   40.   50.   60.   70.   80.   90.  100.]
 [   0.   10.   20.   30.   40.   50.   60.   70.   80.   90.  100.]]

但我希望输出(对于第一维中的任何i)是这个的转置。即填充列而不是行

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

如果您希望输出为转置,只需执行:

>>> import numpy as np
>>> x = np.zeros((96,11,11,2,10),dtype=np.float64)
>>> y = np.array([0,10,20,30,40,50,60,70,80,90,100],dtype=np.float64)
>>> for i in range(x.shape[0]):
>>>    x[i,:,:,0,0] = x[i,:,:,0,0].T
>>> print x[0,:,:,0,0]
 [[   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]
  [  10.   10.   10.   10.   10.   10.   10.   10.   10.   10.   10.]
  [  20.   20.   20.   20.   20.   20.   20.   20.   20.   20.   20.]
  [  30.   30.   30.   30.   30.   30.   30.   30.   30.   30.   30.]
  [  40.   40.   40.   40.   40.   40.   40.   40.   40.   40.   40.]
  [  50.   50.   50.   50.   50.   50.   50.   50.   50.   50.   50.]
  [  60.   60.   60.   60.   60.   60.   60.   60.   60.   60.   60.]
  [  70.   70.   70.   70.   70.   70.   70.   70.   70.   70.   70.]
  [  80.   80.   80.   80.   80.   80.   80.   80.   80.   80.   80.]
  [  90.   90.   90.   90.   90.   90.   90.   90.   90.   90.   90.]
  [ 100.  100.  100.  100.  100.  100.  100.  100.  100.  100.  100.]]

它更新第一个维度,这是第34个索引的输出:

>>> print x[34,:,:,0,0]
 [[   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]
  [  10.   10.   10.   10.   10.   10.   10.   10.   10.   10.   10.]
  [  20.   20.   20.   20.   20.   20.   20.   20.   20.   20.   20.]
  [  30.   30.   30.   30.   30.   30.   30.   30.   30.   30.   30.]
  [  40.   40.   40.   40.   40.   40.   40.   40.   40.   40.   40.]
  [  50.   50.   50.   50.   50.   50.   50.   50.   50.   50.   50.]
  [  60.   60.   60.   60.   60.   60.   60.   60.   60.   60.   60.]
  [  70.   70.   70.   70.   70.   70.   70.   70.   70.   70.   70.]
  [  80.   80.   80.   80.   80.   80.   80.   80.   80.   80.   80.]
  [  90.   90.   90.   90.   90.   90.   90.   90.   90.   90.   90.]
  [ 100.  100.  100.  100.  100.  100.  100.  100.  100.  100.  100.]]

答案 1 :(得分:2)

您需要将y从1D更改为2D(使用一列):

x[:,:,:,0,0] = y[:, np.newaxis]

,或者

x[:,:,:,0,0] = y.reshape(11,1)

答案 2 :(得分:0)

问题很简单:您使用y的行向量而不是列向量,因此它按行而不是按列填充。

从技术上讲,您已经获得了一个形状(11,)的数组,而不是(11, 1)的数组,因此在填充2D数组时它会广播到(1, 11)

比较

>>> x = np.zeros((96,11,11,2,10),dtype=np.float64)
>>> y = np.array([[0],[10],[20],[30],[40],[50],[60],[70],[80],[90],[100]],dtype=np.float64)
>>> x[:,:,:,0,0]=y
>>> print x[0,:,:,0,0]
[[   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]
 [  10.   10.   10.   10.   10.   10.   10.   10.   10.   10.   10.]
 [  20.   20.   20.   20.   20.   20.   20.   20.   20.   20.   20.]
 [  30.   30.   30.   30.   30.   30.   30.   30.   30.   30.   30.]
 [  40.   40.   40.   40.   40.   40.   40.   40.   40.   40.   40.]
 [  50.   50.   50.   50.   50.   50.   50.   50.   50.   50.   50.]
 [  60.   60.   60.   60.   60.   60.   60.   60.   60.   60.   60.]
 [  70.   70.   70.   70.   70.   70.   70.   70.   70.   70.   70.]
 [  80.   80.   80.   80.   80.   80.   80.   80.   80.   80.   80.]
 [  90.   90.   90.   90.   90.   90.   90.   90.   90.   90.   90.]
 [ 100.  100.  100.  100.  100.  100.  100.  100.  100.  100.  100.]]

当然,在您的真实代码中,y可能不是文字,而是一些早期计算的结果。 (即使它一个文字,你也不想输入所有这些额外的括号。)所以,假设y本质上是一个行向量,因为我们必须处理用它。

所以,只需动态重塑它:

>>> x = np.zeros((96,11,11,2,10),dtype=np.float64)
>>> y = np.array([0,10,20,30,40,50,60,70,80,90,100],dtype=np.float64)
>>> x[:,:,:,0,0] = y.reshape((11, 1))

同样的结果。