簡體   English   中英

關於Numpy Broadcasting Answer的解釋

[英]Explanation on Numpy Broadcasting Answer

我最近在這里發了一個問題,答案完全按照我的要求回答。 但是,我認為我高估了我進一步操縱答案的能力。 我閱讀了廣播文檔,並按照一些鏈接引導我回到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]]

謝謝你的幫助。

您可以稍微調整當前代碼以使其正常工作。

>>> 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 dtype(或者甚至更復雜的東西,只允許在前兩列中使用浮點數)。
  2. 而不是N**3總值,計算每列的不同值的數量,並將它們相乘以得到我們的總大小。 這同時用於zerosarange
  3. 在第一個廣播操作中使用floor division //運算符,因為此時我們需要整數,但稍后我們會想要浮點數。
  4. 要除的值再次基於后面列的值的數量(例如,對於A,B,C值的值,除以B*C, C, 1 )。
  5. 添加新的廣播操作以乘以各種比例因子(每個值一次增加多少)。
  6. 更改廣播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]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM