Numpy数组存储有不同的连续类型(C-和F-)。使用numpy.swapaxes()时,连续类型会发生变化。我需要添加两个多维数组(3d更具体),其中一个来自另一个具有交换轴的数组。我注意到的是当第一个轴与最后一个轴交换时,在3d数组的情况下,连续类型从C-变为F-。添加两个具有不同连续类型的数组非常慢(比添加两个C连续数组慢约6倍)。但是,如果交换其他轴(0-1或1-2),则生成的数组将具有C-和F-连续(非连续)的错误标志。对我来说奇怪的是,添加一个C-configuous数组和一个既不是C-也不是F-连续的数组,实际上只比添加两个相同类型的数组稍慢。以下是我的两个问题:
为什么C-& F-连续arrray添加和C-&非连续阵列添加似乎有所不同?是由不同的重新排列机制引起的,还是仅仅因为所有可能的轴顺序的C-和F-连续之间的重新排列距离最长?
如果我必须添加一个C连续数组和一个F连续/非连续数组,那么加速速度的最佳方法是什么?
以下是我遇到的最低限度示例。我计算机上的三个打印持续时间是2.0s(C连续+ C连续),12.4s(C连续+ F连续),3.4s(C连续+非连续)和3.3s(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)
答案 0 :(得分:0)
这些类型(F
和C
)表示矩阵(或多维数组)是否存储在列主要(C
中,如同使用列主要的C语言一样存储)或行主要(F
,如Fortran语言,它使用行主存储。)
两者的速度并没有真正变化。它只是一个抽象层。无论你使用哪一个,它都会带来同样的性能。
然而,最重要的是阵列是否连续。如果它们是连续的,那么您将获得编译器可能应用的缓存效果,矢量化和其他优化游戏的良好时序。