检查集合中的值是否在python中的numpy数组中

mkm*_*ell 7 python numpy

我想检查NumPyArray中是否有一个集合中的值,如果是这样,则设置该数组中的区域= 1.如果没有设置keepRaster = 2.

numpyArray = #some imported array
repeatSet= ([3, 5, 6, 8])

confusedRaster = numpyArray[numpy.where(numpyArray in repeatSet)]= 1
Run Code Online (Sandbox Code Playgroud)

产量:

<type 'exceptions.TypeError'>: unhashable type: 'numpy.ndarray'
Run Code Online (Sandbox Code Playgroud)

有没有办法循环它?

 for numpyArray
      if numpyArray in repeatSet
           confusedRaster = 1
      else
           keepRaster = 2
Run Code Online (Sandbox Code Playgroud)

澄清并要求进一步帮助:

我想要得到的,现在正在做的是将光栅输入放入数组中.我需要读取二维数组中的值,并根据这些值创建另一个数组.如果数组值在一个集合中,那么该值将为1.如果它不在一个集合中,那么该值将从另一个输入派生,但我现在说77.这就是我目前正在使用的.我的测试输入有大约1500行和3500列.它总是在第350行附近冻结.

for rowd in range(0, width):
    for cold in range (0, height):
        if numpyarray.item(rowd,cold) in repeatSet:
            confusedArray[rowd][cold] = 1
        else:
            if numpyarray.item(rowd,cold) == 0:
                confusedArray[rowd][cold] = 0
            else:
                confusedArray[rowd][cold] = 2
Run Code Online (Sandbox Code Playgroud)

sen*_*rle 13

在1.4及更高版本中,numpy提供了该in1d功能.

>>> test = np.array([0, 1, 2, 5, 0])
>>> states = [0, 2]
>>> np.in1d(test, states)
array([ True, False,  True, False,  True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

您可以将其用作分配的掩码.

>>> test[np.in1d(test, states)] = 1
>>> test
array([1, 1, 1, 5, 1])
Run Code Online (Sandbox Code Playgroud)

以下是numpy的索引和赋值语法的一些更复杂的用法,我认为它们将适用于您的问题.注意使用按位运算符替换if基于逻辑:

>>> numpy_array = numpy.arange(9).reshape((3, 3))
>>> confused_array = numpy.arange(9).reshape((3, 3)) % 2
>>> mask = numpy.in1d(numpy_array, repeat_set).reshape(numpy_array.shape)
>>> mask
array([[False, False, False],
       [ True, False,  True],
       [ True, False,  True]], dtype=bool)
>>> ~mask
array([[ True,  True,  True],
       [False,  True, False],
       [False,  True, False]], dtype=bool)
>>> numpy_array == 0
array([[ True, False, False],
       [False, False, False],
       [False, False, False]], dtype=bool)
>>> numpy_array != 0
array([[False,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True]], dtype=bool)
>>> confused_array[mask] = 1
>>> confused_array[~mask & (numpy_array == 0)] = 0
>>> confused_array[~mask & (numpy_array != 0)] = 2
>>> confused_array
array([[0, 2, 2],
       [1, 2, 1],
       [1, 2, 1]])
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用numpy.where,创建一个全新的数组,使用第二个参数中的值,其中mask为true,第三个参数的mask值为false.(与赋值一样,参数可以是标量或与形状相同的数组mask.)这可能比上面的更有效,而且它肯定更简洁:

>>> numpy.where(mask, 1, numpy.where(numpy_array == 0, 0, 2))
array([[0, 2, 2],
       [1, 2, 1],
       [1, 2, 1]])
Run Code Online (Sandbox Code Playgroud)