【问题标题】:Create array by conditional masking通过条件掩码创建数组
【发布时间】:2017-08-30 17:45:17
【问题描述】:

我有多个包含数千个元素的数组。我需要打开所有这些并使用多个条件创建一个输出数组。 使用此问题 (Iterating over a numpy array) 中的说明,我设法创建了一个解决方案,但它在我的大型阵列上运行非常缓慢。

代码是这样的,在一个只有两个数组的测试样本上运行(我可以有两个以上):

import numpy as np
from random import randint
import random


def declare_arrays():
    random.seed(1)
    w, h = 10, 10
    mat1 = np.array([[randint(0, 100) for x in range(w)] for y in range(h)])
    print (mat1, type(mat1))

    random.seed(2)
    mat2 = np.array([[randint(0, 100) for i in range(w)] for j in range(h)])
    print (mat2, type(mat2))

    return mat1, mat2


if __name__=="__main__":
    arr1, arr2 = declare_arrays()

    arr_out = np.zeros(arr1.shape)

    for (i, j), val1 in np.ndenumerate(arr1):
        val2 = arr2[i, j]

        if (val1 > val2) and (val2 > 5):
            arr_out[i, j] = val2
        else:
            arr_out[i, j] = val1
    print("Arr out: ", arr_out)

这给出了结果:

Arr out:
 [[   7.   11.   10.    8.   21.   15.   63.   39.   32.   60.]
 [  27.   48.  100.   26.   12.   20.    3.   49.   50.   77.]
 [  65.   47.    0.   56.   57.   34.   92.   29.   46.   13.]
 [  40.    3.    2.    3.   21.   69.    1.   30.   29.   27.]
 [  22.   41.    3.   17.   28.   65.   46.   63.   70.   29.]
 [  23.   29.   53.   28.   67.   58.   37.    2.   45.   46.]
 [  57.   12.   23.   51.   91.   37.   15.   83.   42.   31.]
 [  62.   35.   54.   64.   65.   24.   38.   36.   59.   44.]
 [  64.   50.   71.    4.   58.   31.   84.   28.   41.   85.]
 [  21.   46.   34.   89.   61.   39.   38.   47.   11.   56.]]

但这是在 10x10 阵列上运行的。如果我在 10000x10000 阵列上运行它,则需要大量时间。有没有办法让它更快? 感谢您的帮助!

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    使用np.where 替换那些逐元素操作 -

    arr_out = np.where( (arr1 > arr2) & (arr2 > 5), arr2, arr1)
    

    【讨论】:

    • 谢谢。这好多了!
    猜你喜欢
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多