通过条件屏蔽创建数组

时间:2017-08-30 09:41:25

标签: python arrays numpy

我有数千个元素的多个数组。我需要打开所有这些并使用多个条件创建输出数组。 使用此问题(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阵列上运行它,则需要很长时间。有没有办法让这更快? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

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

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