我最近发布了一个问题here,其答案完全按照我的要求回答。但是,我认为我高估了我进一步操纵答案的能力。我阅读了广播文档,并按照一些链接引导我回到2002年关于numpy广播。
我使用broadcasting创建了第二种数组方法:
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]]
感谢您的帮助。
答案 0 :(得分: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. ]])
变化是:
int
dtype,因为我们需要它来保存某些列中的浮点数。如果需要,可以指定float
dtype(或者甚至更复杂的东西,只允许在前两列中使用浮点数。)N**3
总值,计算每列的不同值的数量,并将它们相乘以得到我们的总大小。这适用于zeros
和arange
。//
运算符,因为此时我们需要整数,但稍后我们会想要浮点数。A,B,C
个数值除以B*C, C, 1
)。%
操作中的值以匹配每列的边界。答案 1 :(得分: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]])