有类似的问题,但它们是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的偏移量,我无法弄清楚如何添加到我现有的结构中。
提前谢谢。
答案 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]])