沿轴进行NumPy矢量化总是有可能吗?

问题描述

我有一个计算要沿着NumPy数组的轴进行,我想知道是否有任何方法可以围绕for循环,因为这似乎很慢。通常,我总是尝试对代码进行矢量化处理,但是通过这种计算,我只是不知道该怎么做。

因此,假设我有一个形状为(7000 x 10)的二维数组X。类似一半的条目是NaN值。 现在,我正在查看X的每一行(名为x_i),它是形状为(10)的一维数组。根据x_i中非NaN值的索引,我正在划分形状为(10)的1d数组M和形状为(10 x 10)的2d数组C。然后,我用它进行一些计算,并沿X的第一个轴重复所有操作。

我的代码(相当简化)看起来或多或少像这样:

X = np.random.random_sample((7000,10))  # Note that in the real case,X also has a lot of NaN values
M = np.random.random_sample(10)
C = np.random.random_sample((10,10))

Res = np.empty(X.shape[0])   # Preallocation of result

for i in range(X.shape[0]):
    # Get row i of X
    x_i = X[i]

    # Get indices of the non-NaN values in x_i
    index_not_nan_i = np.where(~np.isnan(x_i))[0]
    
    # Partition M and C according to indices
    M_i = M[index_not_nan_i]
    C_i = C[index_not_nan_i[...,None],index_not_nan_i]


    Res[i] = M_i @ C_i @ M_i

示例:

让我们说X的第一行看起来像x_i = [5,3,6,NaN,7,NaN,NaN,0,5,NaN]; 因此index_not_nan_i = [0,1,2,4,7,8]。 由于x_i中有6个非NaN值,因此M_i的形状为(6),而C_i的形状为(6,6)。 下一个x_i当然在其他位置具有NaN值,因此index_not_nan_i可能为[3,5],M_i和C_i的形状分别为(3)和(3 x 3)。

有矢量化的可能性吗? 我已经尝试过numpy.apply_along_axis(),但是就性能而言,这似乎只是一个常规的for循环。同样,根据文档numpy.vectorize()似乎也是一个for循环,尽管我还没有尝试过。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)