我想获取一个三维数组中给定方向的二维切片,其中direction
(或要提取切片的轴)由另一个变量给出。
假设idx
是三维数组中二维切片的索引,direction
是获取该二维切片的轴,则最初的方法是:
if direction == 0:
return A[idx, :, :]
elif direction == 1:
return A[:, idx, :]
else:
return A[:, :, idx]
我相信一定有一种方法可以在不使用条件语句的情况下完成这项任务,或者至少不是在原始的Python中。NumPy是否有一个快捷方式来完成这个呢?
到目前为止我找到的更好的解决方案(用于动态地执行它),依赖于转置运算符:
# for 3 dimensions [0,1,2] and direction == 1 --> [1, 0, 2]
tr = [direction] + range(A.ndim)
del tr[direction+1]
return np.transpose(A, tr)[idx]
不过我在想是否有更好/更容易/更快的函数可以实现这个功能,因为对于三维来说,转置代码看起来几乎比三个if / elif 还要丑陋。它针对ND进行了更好的概括,N越大,与之相比代码越美观,但对于三维来说基本相同。
strides
的数组,对吧?除非你调用.copy()
,它不会重新排列内存中的数据。根据几个%timeit
测试,在A = np.random.randn(1000,1000)
和B = A.T
的情况下,访问A[:, idx]
中的随机列比访问相同数据的B[idx]
慢。然而,如果我们完全索引B[idx, :]
,访问B
中的数据会变得更加昂贵。这是一种大约为50 ns
(x1.25 速度提升)的情况,所以并不重要,但我很好奇。你知道在 numpy 中这是如何工作的吗? - Imanol LuengoB[100]
或A.T[100,:]
时,flags
和__array_interface__
看起来是相同的。 - hpaulj