python - Numpy Broadcasting Answer 的解释

标签 python arrays numpy array-broadcasting

我最近发布了一个问题 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]]

感谢您的帮助。

最佳答案

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

>>> 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. 数组上没有 int dtype,因为我们需要它在某些列中保存 float 。如果需要,您可以指定 float dtype(或者甚至更复杂的东西,只允许前两列中的 float )。
  2. 不是 N**3 个总值,而是算出每一列的不同值的数量,然后将它们相乘得到我们的总大小。这用于 zerosarange
  3. 在第一个广播操作中使用 floor division // 运算符,因为此时我们需要整数,但稍后我们需要 float 。
  4. 要除以的值再次基于后面列的值的数量(例如,对于 A,B,C 个值,除以 B*C、C、 1).
  5. 添加一个新的广播操作以乘以各种比例因子(每个值一次增加多少)。
  6. 更改广播 mod % 操作中的值以匹配每列的边界。

关于python - Numpy Broadcasting Answer 的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37780057/

相关文章:

python - 读入 np 数组不起作用

python - 使用单个 plt.bar() 函数设置条形图标签和值

python - anaconda安装dlib报错

c++ - 我的数组循环出现(逻辑?)错误

python - numpy数组维度不匹配错误

python - 曲线拟合分段函数?

python - 在Python中移动矩阵行的最快方法

python - 尝试恢复检查点时 Tensorflow 失败并显示 "Unable to get element from the feed as bytes."

python - 设备代码流 - Microsoft Azure 身份验证

arrays - 如果在列表中找到值则删除整行vba