2

我有两个向量;一个代表一天中的几个小时,[1,2,3,...,24]第二个代表一年中的几天[1,2,3,4,5,6,...,365]

我想构建一个 24*365 单元格、24 行和 365 列的矩阵。

就像是:

a = [(1,24),(2,24),(3,24),(4,24),(5,24),...,(365,24),
     (1,23),(2,23),(3,23),(4,23),(5,23),...,(365,23),
     (1,22),(2,22),(3,22),(4,22),(5,22),...,(365,22),
          .,
          .,
          .,
          .,
     (1,1),(2,1),(3,1),(4,1),(5,1),...,(365,1)]

在我想应用一个函数f(x,y)并将其替换为x,yz保持相同的矩阵结构)之后。最终,这将被转换为带有渐变的颜色图。

4

3 回答 3

1

虽然我完全同意@Andrew Walker(3-d 数组会更有效率),但以下代码会生成您要求的数组:

import numpy as np
a = np.empty((24, 365), dtype=tuple)
for i, h in enumerate(range(24, 0, -1)):
    for k, d in enumerate(range(1, 366)):
        x[i, k] = (d, h)

尽管这种嵌套for循环效率低下并且肯定是不可避免的,但创建此数组所需的时间非常短。如果您需要更优化的版本(避免循环的版本),请在评论中说明。

于 2013-10-16T17:26:10.507 回答
1

可能值得注意的是,虽然您可能能够将通用对象存储在 numpy 数组中,但这可能不是一个好主意 - 大多数算法都经过优化,以便在矩阵的每个槽中都有一个值。

这样做的结果是,您可能不会最终得到一个 24 x 365 元素矩阵,每个插槽中有两个值,而是最终得到一个 2 x 24 x 365 元素的 numpy 数组。

做类似的事情的一种方法是:

hours = numpy.arange(365).reshape(1,-1).repeat(24,axis=0)
days = numpy.arange(24).reshape(-1,1).repeat(365,axis=1)
full = numpy.array([days, hours])
print full
print full.shape

这使:

[[[  0   0   0 ...,   0   0   0]
  [  1   1   1 ...,   1   1   1]
  [  2   2   2 ...,   2   2   2]
  ..., 
  [ 21  21  21 ...,  21  21  21]
  [ 22  22  22 ...,  22  22  22]
  [ 23  23  23 ...,  23  23  23]]

 [[  0   1   2 ..., 362 363 364]
  [  0   1   2 ..., 362 363 364]
  [  0   1   2 ..., 362 363 364]
  ..., 
  [  0   1   2 ..., 362 363 364]
  [  0   1   2 ..., 362 363 364]
  [  0   1   2 ..., 362 363 364]]]
(2, 24, 365)
于 2013-10-16T07:42:10.867 回答
1

您可以拥有一个与您想要的结构相同的数组:

a = np.mgrid[1:366, 24:0:-1].T

第一行和最后一行:

a[0]
array([[  1,  24],
       [  2,  24],
       [  3,  24],
       ...,
       [363,  24],
       [364,  24],
       [365,  24]])

a[-1]
array([[  1,   1],
       [  2,   1],
       [  3,   1],
       ..., 
       [363,   1],
       [364,   1],
       [365,   1]])

第一列和最后一列:

a[:,0]
array([[ 1, 24],
       [ 1, 23],
       [ 1, 22],
       ...,
       [ 1,  3],
       [ 1,  2],
       [ 1,  1]])

a[:,-1]
array([[365,  24],
       [365,  23],
       [365,  22],
       ...,
       [365,   3],
       [365,   2],
       [365,   1]])

所有的日子,所有的岁月:

a[...,0]
array([[  1,   2,   3, ..., 363, 364, 365],
       [  1,   2,   3, ..., 363, 364, 365],
       [  1,   2,   3, ..., 363, 364, 365],
       ..., 
       [  1,   2,   3, ..., 363, 364, 365],
       [  1,   2,   3, ..., 363, 364, 365],
       [  1,   2,   3, ..., 363, 364, 365]])

a[...,1]
array([[24, 24, 24, ..., 24, 24, 24],
       [23, 23, 23, ..., 23, 23, 23],
       [22, 22, 22, ..., 22, 22, 22],
       ..., 
       [ 3,  3,  3, ...,  3,  3,  3],
       [ 2,  2,  2, ...,  2,  2,  2],
       [ 1,  1,  1, ...,  1,  1,  1]])
于 2013-10-16T17:57:45.017 回答