7

我想检查 NumPyArray 中是否包含一组值,如果是,则将该区域设置为数组 = 1。如果没有设置 keepRaster = 2。

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

confusedRaster = numpyArray[numpy.where(numpyArray in repeatSet)]= 1

产量:

<type 'exceptions.TypeError'>: unhashable type: 'numpy.ndarray'

有没有办法循环它?

 for numpyArray
      if numpyArray in repeatSet
           confusedRaster = 1
      else
           keepRaster = 2

澄清并寻求进一步的帮助:

我正在尝试和目前正在做的是将栅格输入放入数组中。我需要读取二维数组中的值并根据这些值创建另一个数组。如果数组值在集合中,则值为 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
4

3 回答 3

14

在 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)

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

>>> test[np.in1d(test, states)] = 1
>>> test
array([1, 1, 1, 5, 1])

以下是 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]])

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

>>> numpy.where(mask, 1, numpy.where(numpy_array == 0, 0, 2))
array([[0, 2, 2],
       [1, 2, 1],
       [1, 2, 1]])
于 2012-05-21T18:43:39.790 回答
1

这是一种可能的方式来做你想做的事:

numpyArray = np.array([1, 8, 35, 343, 23, 3, 8]) # could be n-Dimensional array
repeatSet = np.array([3, 5, 6, 8])
mask = (numpyArray[...,None] == repeatSet[None,...]).any(axis=-1) 
print mask
>>> [False  True False False False  True  True]
于 2012-05-21T18:17:09.327 回答
0

最近numpy,您可以使用np.isin和的组合np.where来实现此结果。第一种方法输出一个布尔 numpy 数组,该数组的值True等于一个类似数组的指定测试元素(请参阅doc),而第二种方法可以创建一个新数组,该数组设置一些值,其中指定的条件计算为True和另一个值 where False

例子

我将用一个随机数组做一个例子,但使用你提供的特定值。

import numpy as np

repeatSet = ([2, 5, 6, 8])

arr = np.array([[1,5,1],
                [0,1,0],
                [0,0,0],
                [2,2,2]])

out = np.where(np.isin(arr, repeatSet), 1, 77)

> out
array([[77,  1, 77],
       [77, 77, 77],
       [77, 77, 77],
       [ 1,  1,  1]])
于 2021-01-06T21:35:21.767 回答