Numpy Broadcasting Answer 的解释
Explanation on Numpy Broadcasting Answer
我最近发布了一个问题 ,该问题的回答完全符合我的要求。但是,我认为我高估了自己进一步操纵答案的能力。我阅读了广播文档,并点击了一些链接,这些链接让我回到了 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]]
感谢您的帮助。
您可以稍微调整当前代码以使其正常工作。
>>> 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
。
- 在第一个广播操作中使用 floor 除法
//
运算符,因为此时我们需要整数,但稍后我们需要浮点数。
- 要除以的值再次基于后面列的值的数量(例如,对于
A,B,C
个值,除以 B*C, C, 1
)。
- 添加一个新的广播操作以乘以各种比例因子(每个值一次增加多少)。
- 更改广播 mod
%
操作中的值以匹配每列的边界。
这个小例子帮助我理解发生了什么:
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]])
我最近发布了一个问题
我使用了第二种创建数组的方法 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]]
感谢您的帮助。
您可以稍微调整当前代码以使其正常工作。
>>> 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
。 - 在第一个广播操作中使用 floor 除法
//
运算符,因为此时我们需要整数,但稍后我们需要浮点数。 - 要除以的值再次基于后面列的值的数量(例如,对于
A,B,C
个值,除以B*C, C, 1
)。 - 添加一个新的广播操作以乘以各种比例因子(每个值一次增加多少)。
- 更改广播 mod
%
操作中的值以匹配每列的边界。
这个小例子帮助我理解发生了什么:
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]])