我想知道是否有一種方法可以移動 numpy 陣列的所有元素,而無需遍歷每個條目。我希望的轉變是通過固定的 XOR 操作重新標記索引,形式如下:
import numpy as np
N = 2
x = np.arange(2**(2 * N)).reshape(2**N, 2**N)
z = np.zeros((2**N, 2**N))
k = 1
for i in range(2**N):
for j in range(2**N):
z[i][j] = x[i ^ k][j ^ k]
我遇到的問題是后者我希望采用 的巨大值N,如果我們希望遍歷每個條目,這將成為瓶頸。任何關于如何一次完成移動的建議將不勝感激。
uj5u.com熱心網友回復:
根本沒有理由在這里使用回圈。你沒有改變任何東西,問題在軸上是完全可分離的:
x = np.arange(2**(2 * N)).reshape(2**N, 2**N)
z = x[np.arange(2**N)[:, None] ^ k, np.arange(2**N) ^ k]
但是x[a, b]有些a, b人從什么開始呢?從原來的定義可以看出是a * 2**N b. 因此,您可以插入a = np.arange(2**N)[:, None] ^ k并b = np.arange(2**N) ^ k避免生成除最終結果之外的任何內容:
idx = np.arange(2**N) ^ k
z = (idx[:, None] << N) idx
<< N替換它通常更快* 2**N。
分配
此處顯示的解決方案均未預先分配z。但是,如果您要這樣做,就像在原始問題中一樣,您應該注意型別。
z = np.zeros((2**N, 2**N))
默認情況下,這會創建一個浮點陣列,這可能不是您想要的。
z = np.zeros((2**N, 2**N), dtype=int)
添加顯式dtype使陣列變為整數。但是,您可以使用的最簡單的方法可能是
z = np.zeros_like(x)
由于您計劃填充每個元素,因此您無需浪費時間先用零填充它。np.empty在這種情況下提供了更好的選擇:
z = np.empty((2**N, 2**N), dtype=int)
或者
z = np.empty_like(x)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414368.html
標籤:
上一篇:有沒有辦法在PANDASdf上以矢量化方式有條件地復制值?
下一篇:在numpy中停止自動舍入
