【发布时间】:2024-04-29 00:10:05
【问题描述】:
我正在尝试在 Cython 中实现一个 NaN 安全的洗牌程序,它可以沿着任意维度的多维矩阵的多个轴进行洗牌。
在一维矩阵的简单情况下,可以使用 Fisher-Yates 算法简单地对所有具有非 NaN 值的索引进行洗牌:
def shuffle1D(np.ndarray[double, ndim=1] x):
cdef np.ndarray[long, ndim=1] idx = np.where(~np.isnan(x))[0]
cdef unsigned int i,j,n,m
randint = np.random.randint
for i in xrange(len(idx)-1, 0, -1):
j = randint(i+1)
n,m = idx[i], idx[j]
x[n], x[m] = x[m], x[n]
我想扩展此算法以处理大型多维数组而无需重塑(这会触发此处未考虑的更复杂情况的副本)。为此,我需要摆脱固定的输入维度,这对于 numpy 数组和 Cython 中的 memoryviews 似乎都是不可能的。有解决办法吗?
非常感谢!
【问题讨论】:
-
那么问题只是具有任意数量的维度吗?
-
当输入的维度未知时,你会使用多少个for循环?
-
@moarningsun 在一般情况下,可以使用数组步幅沿任意轴扫描内存...
标签: python arrays numpy multidimensional-array cython