Numpy 配列は、異なる連続した型 (C- および F-) で格納されます。numpy.swapaxes() を使用すると、連続した型が変更されます。2 つの多次元配列 (より具体的には 3d) を追加する必要があります。そのうちの 1 つは、軸が交換された別の配列から取得されます。私が気付いたのは、最初の軸が最後の軸と交換されると、3D 配列の場合、連続した型が C- から F- に変わることです。また、連続した型が異なる 2 つの配列を追加すると、非常に遅くなります (2 つの C 連続配列を追加するよりも約 6 倍遅くなります)。ただし、他の軸が交換された場合 (0-1 または 1-2)、結果の配列には、C および F 連続 (非連続) の両方に対して偽のフラグが設定されます。私にとって奇妙なことは、C 構成の配列を 1 つ追加し、C も F も連続していない配列を 1 つ追加することは、実際には、同じタイプの 2 つの配列を追加するよりもわずかに遅いことです。
C-&F-連続配列の追加と C-&非連続配列の追加で異なるように見えるのはなぜですか? 再配置メカニズムの違いが原因ですか、それとも単に C- と F- 隣接間の再配置距離が考えられるすべての軸順序で最も長いためですか?
C-contiguous 配列と F-contiguous/non-contiguous 配列を追加する必要がある場合、速度を加速する最良の方法は何ですか?
以下は、私が遭遇したものの最小限の例です。私のコンピューターで印刷された 3 つの持続時間は、2.0 秒 (C 連続 + C 連続)、12.4 秒 (C 連続 + F 連続)、3.4 秒 (C 連続 + 非連続)、および 3.3 秒 (C 連続) です。 + 不連続)。
import numpy as np
import time
np.random.seed(1234)
a = np.random.random((300, 400, 500)) # C-contiguous
b = np.swapaxes(np.random.random((500, 400, 300)), 0, 2) # F-contiguous
c = np.swapaxes(np.random.random((300, 500, 400)), 1, 2) # Non-contiguous
d = np.swapaxes(np.random.random((400, 300, 500)), 0, 1) # Non-contiguous
t = time.time()
for n in range(10):
result = a + a
print(time.time() - t)
t = time.time()
for n in range(10):
result = a + b
print(time.time() - t)
t = time.time()
for n in range(10):
result = a + c
print(time.time() - t)
t = time.time()
for n in range(10):
result = a + d
print(time.time() - t)