Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 沿着轴的NumPy矢量化总是可能的吗?_Python_Numpy_Vectorization - Fatal编程技术网

Python 沿着轴的NumPy矢量化总是可能的吗?

Python 沿着轴的NumPy矢量化总是可能的吗?,python,numpy,vectorization,Python,Numpy,Vectorization,我有一个沿着NumPy数组的轴进行的计算,我想知道是否有任何方法可以绕过for循环,因为这看起来非常慢。通常,我总是试图将代码矢量化,但通过这种计算,我不知道如何实现 假设我有一个形状为(7000 X 10)的2d数组X。有一半的条目是NaN值。 我现在看X的每一行(命名为X_I),这是一个具有形状(10)的一维数组。基于x_i中非NaN值的索引,我将对一维数组m,shape(10)和二维数组C,shape(10 x 10)进行分区。然后我用它做一些计算,沿着X的第一个轴重复所有的事情 我的代码

我有一个沿着NumPy数组的轴进行的计算,我想知道是否有任何方法可以绕过for循环,因为这看起来非常慢。通常,我总是试图将代码矢量化,但通过这种计算,我不知道如何实现

假设我有一个形状为(7000 X 10)的2d数组X。有一半的条目是NaN值。 我现在看X的每一行(命名为X_I),这是一个具有形状(10)的一维数组。基于x_i中非NaN值的索引,我将对一维数组m,shape(10)和二维数组C,shape(10 x 10)进行分区。然后我用它做一些计算,沿着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]; 因此,索引_not_nan_i=[0,1,2,4,7,8]。 由于x_i中有6个非NaN值,因此M_i的形状为(6),C_i的形状为(6,6)。 下一个x_i当然会在其他位置有NaN值,所以index_不是,NaN_i可能是[3,7,5],M_i和C_i的形状是(3)和(3 x 3)

有没有矢量化的可能性?
我已经尝试过numpy.apply_沿_轴(),但就性能而言,这似乎是一个常规的for循环。另外,根据文档numpy.vectorize()似乎也是一个for循环,尽管我还没有尝试过它。

M和C的大小和形状可以不是X吗?然后只应用2D mask?
numpy
没有通过简单的包装来提高性能的工具。@GhandiFloss实际上尺寸19000还涉及到另一个维度。所以C实际上是形状19000x10x10,如果我播放它来匹配X的形状,我会有一个形状7000x19000x10x10的数组。然后我的内存就用完了。正常的矢量化使用广播和
axis
参数在高维数组上使用快速编译的代码<代码>@例如,可以在
批次上执行
dot
产品(第一维度)。但是,如果您的
mi
ci
的大小因
i
的不同而不同,那么这可能没有什么用处。一般来说,在处理大小不同的数组时,“矢量化”是很困难的(在这种情况下,无法生成3d+数组)。能否将X转换为0和1表示NaN而不是NaN。然后通过乘法得到数组。