3

我最近在这里发布了一个问题,正如我所问的那样得到了回答。但是,我认为我高估了我进一步操纵答案的能力。我阅读了广播文档,并点击了一些链接,这些链接让我回到了 2002 年关于 numpy 广播的方式。

我使用了第二种使用广播创建数组的方法:

N = 10
out = np.zeros((N**3,4),dtype=int)
out[:,:3] = (np.arange(N**3)[:,None]/[N**2,N,1])%N

输出:

[[0,0,0,0]
 [0,0,1,0]
 ...
 [0,1,0,0]
 [0,1,1,0]
 ...
 [9,9,8,0]
 [9,9,9,0]]

但我不明白如何通过文档来操作它。理想情况下,我希望能够设置每个列更改的增量。

前任。A 列变化 0.5 到 2,B 列变化 0.2 到 1,C 列变化 1 到 10。

[[0,0,0,0]
 [0,0,1,0]
 ...
 [0,0,9,0]
 [0,0.2,0,0]
 ...
 [0,0.8,9,0]
 [0.5,0,0,0]
 ...
 [1.5,0.8,9,0]]

谢谢你的帮助。

4

2 回答 2

4

您可以稍微调整当前代码以使其正常工作。

>>> out = np.zeros((4*5*10,4))
>>> out[:,:3] = (np.arange(4*5*10)[:,None]//(5*10, 10, 1)*(0.5, 0.2, 1)%(2, 1, 10))
>>> out
array([[ 0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  1. ,  0. ],
       [ 0. ,  0. ,  2. ,  0. ],
       ...
       [ 0. ,  0. ,  8. ,  0. ],
       [ 0. ,  0. ,  9. ,  0. ],
       [ 0. ,  0.2,  0. ,  0. ],
       ...
       [ 0. ,  0.8,  9. ,  0. ],
       [ 0.5,  0. ,  0. ,  0. ],
       ...
       [ 1.5,  0.8,  9. ,  0. ]])

这些变化是:

  1. 数组上没有intdtype,因为我们需要它在某些列中保存浮点数。如果需要,您可以指定一个floatdtype(或者甚至更复杂的只允许在前两列中浮动的东西)。
  2. 而不是N**3总值,计算每列的不同值的数量,并将它们相乘以获得我们的总大小。这用于zerosarange
  3. 在第一个广播操作中使用地板除法//运算符,因为此时我们需要整数,但稍后我们将需要浮点数。
  4. 要除以的值再次基于后面列的值的数量(例如,对于A,B,C值的数量,除以B*C, C, 1)。
  5. 添加一个新的广播操作以乘以各种比例因子(每个值一次增加多少)。
  6. 更改广播 mod%操作中的值以匹配每列的边界。
于 2016-06-13T00:26:41.803 回答
3

这个小例子可以帮助我理解发生了什么:

In [123]: N=2    
In [124]: np.arange(N**3)[:,None]/[N**2, N, 1]
Out[124]: 
array([[ 0.  ,  0.  ,  0.  ],
       [ 0.25,  0.5 ,  1.  ],
       [ 0.5 ,  1.  ,  2.  ],
       [ 0.75,  1.5 ,  3.  ],
       [ 1.  ,  2.  ,  4.  ],
       [ 1.25,  2.5 ,  5.  ],
       [ 1.5 ,  3.  ,  6.  ],
       [ 1.75,  3.5 ,  7.  ]])

因此,我们生成一个数字范围(0 到 7)并将它们除以 4,2 和 1。

其余的计算只是改变每个值而不进一步广播

应用于%N每个元素

In [126]: np.arange(N**3)[:,None]/[N**2, N, 1]%N
Out[126]: 
array([[ 0.  ,  0.  ,  0.  ],
       [ 0.25,  0.5 ,  1.  ],
       [ 0.5 ,  1.  ,  0.  ],
       [ 0.75,  1.5 ,  1.  ],
       [ 1.  ,  0.  ,  0.  ],
       [ 1.25,  0.5 ,  1.  ],
       [ 1.5 ,  1.  ,  0.  ],
       [ 1.75,  1.5 ,  1.  ]])

分配给int数组与将浮点数转换为整数相同:

In [127]: (np.arange(N**3)[:,None]/[N**2, N, 1]%N).astype(int)
Out[127]: 
array([[0, 0, 0],
       [0, 0, 1],
       [0, 1, 0],
       [0, 1, 1],
       [1, 0, 0],
       [1, 0, 1],
       [1, 1, 0],
       [1, 1, 1]])
于 2016-06-13T01:35:17.597 回答