numpy 2d数组使用for循环用升序数字填充它

时间:2018-02-22 23:25:03

标签: python numpy for-loop 2d

有类似的问题,但它们是a)不是用于python或b)不使用我的特定结构使用带有2d numpy数组的for循环。

我想用数字1,2,3,4,5等填充以下numpy数组。

此时它会从1到10填充每一行,然后重新开始:

import numpy

a = numpy.zeros((16,11))

for i in range(11):
  for j in range(16):
    for k in range(16):
      a[j,i]=i+1



print(a)

我希望它能产生:

[[  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.  11.]
 [ 12.  13.  14.  15.  16.  17.  18.  19.  20.  21.  22.]
 [ 23.  24.  25.  26.  27.  28.  29.  30.  31.  32.  33.]
 [ 34.  35.  36.  37.  38.  39.  40.  41.  42.  43.  44.]
 [ 45.  46.  47.  48.  49.  50.  51.  52.  53.  54.  55.]
 [ 56.  57.  58.  59.  60.  61.  62.  63.  64.  65.  66.]
 [ 67.  68.  69.  70.  71.  72.  73.  74.  75.  76.  77.]
etc for a 16 x 11 (16 rows and 11 column array)

有人可以用明确的解释指出错误,也许还有一个更简单的方法来解决这个问题吗? (或替代方法)。我意识到我可能不需要第三个循环,但我正在努力弄清楚如何添加11的偏移量。

以更低效的方式执行此操作....我发现这有效:

for i in range(11):
    a[0,i]=i+1
    a[1,i]=i+12
    a[2,i]=i+23
    a[3,i]=i+34
    a[4,i]=i+45
    a[5,i]=i+56
    a[6,i]=i+67

print(a)

这个位增加了11的偏移量,我无法弄清楚如何添加到我现有的结构中。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

以下是几种方式:

我一直用来生成样本数组的那个:

In [99]: np.arange(1,34).reshape(3,11)
Out[99]: 
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22],
       [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]])

在添加行和列坐标时考虑也很有用。 Numpy广播使这很容易:

In [100]: np.arange(0,33,11)[:,None]+np.arange(1,12)
Out[100]: 
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22],
       [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]])

等效列表代码:

In [101]: [[i+j for j in range(1,12)] for i in range(0,33,11)]
Out[101]: 
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
 [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22],
 [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]]

更接近你的尝试; i,j循环很好,但你需要正确地执行k:

In [106]: k=1
In [107]: out=np.zeros((3,11),int)
In [108]: for i in range(3):
     ...:     for j in range(11):
     ...:         out[i,j] = k
     ...:         k += 1
     ...:         
In [109]: out
Out[109]: 
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22],
       [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]])