可以用Python对以下代码进行矢量化吗?当数组的大小变大时,它运行得非常慢.

import numpy as np

# A, B, C are 3d arrays with shape (K, N, N). 
# Entries in A, B, and C are in [0, 1]. 
# In the following, I use random values in B and C as an example.

K = 5
N = 10000
A = np.zeros((K, N, N))
B = np.random.normal(0, 1, (K, N, N))
C = np.random.normal(0, 1, (K, N, N))

for k in range(K):
    for m in [x for x in range(K) if x != k]:
        for i in range(N):
            for j in range(N):
                if A[m, i, j] not in [0, 1]:
                    if A[k, i, j] == 1:
                        A[m, i, j] = B[m ,i ,j]
                    if A[k ,i, j] == 0:
                        A[m, i, j] = C[m, i, j]

推荐答案

我可以帮助进行部分矢量化,这应该会大大加快速度,但我不确定你对k和m的逻辑,所以没有try 包括这一部分.基本上,您创建了一个遮罩,其中包含了您希望在A的第二和第三维度中判断的条件.然后使用适当的掩码在ABC之间映射:

# A, B, C are 3d arrays with shape (K, N, N). 
# Entries in A, B, and C are in [0, 1]. 
# In the following, I use random values in B and C as an example.

np.random.seed(10)

K = 5
N = 1000
A = np.zeros((K, N, N))
B = np.random.normal(0, 1, (K, N, N))
C = np.random.normal(0, 1, (K, N, N))

for k in range(K):
    for m in [x for x in range(K) if x != k]:
        #if A[m, i, j] not in [0, 1]:
        mask_1 = A[k, :, :] == 1
        mask_0 = A[k, :, :] == 0
        A[m, mask_1] = B[m, mask_1]
        A[m, mask_0] = C[m, mask_0]

我省略了A[m, i, j] not in [0, 1]部分,因为这使得调试变得困难,因为什么都没有发生(A初始化为全零).如果您需要像这样包含其他逻辑,只需为其创建另一个掩码,并在每个掩码的逻辑中包含and.

Python相关问答推荐

在for循环中保存和删除收件箱

将C struct 的指针传递给Python中的ioctel

从Python调用GMP C函数时的分段错误和内存泄漏

如何观察cv2.erode()的中间过程?

如果AST请求默认受csref保护,那么在Django中使用@ system_decorator(csref_protect)的目的是什么?

使用argsorted索引子集索引数组

在使用Guouti包的Python中运行MPP模型时内存不足

在应用循环中间保存pandas DataFrame

剧作家Python:expect(locator).to_be_visible()vs locator.wait_for()

Python中MongoDB的BSON时间戳

多处理代码在while循环中不工作

列表上值总和最多为K(以O(log n))的最大元素数

通过优化空间在Python中的饼图中添加标签

在内部列表上滚动窗口

DataFrame groupby函数从列返回数组而不是值

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

查找两极rame中组之间的所有差异

按列分区,按另一列排序

try 将一行连接到Tensorflow中的矩阵

ConversationalRetrivalChain引发键错误