我想检查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
答案 0 :(得分: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)
您可以将其用作作业的掩码。
>>> 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
创建一个全新的数组,使用第mask
为真的第二个参数的值,以及mask
为mask
的第三个参数的值假。 (与赋值一样,参数可以是标量或与>>> numpy.where(mask, 1, numpy.where(numpy_array == 0, 0, 2))
array([[0, 2, 2],
[1, 2, 1],
[1, 2, 1]])
形状相同的数组。)这可能比上面的更有效,而且它肯定更简洁:
{{1}}
答案 1 :(得分: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]
答案 2 :(得分:0)
在最近的 numpy
中,您可以使用 np.isin
和 np.where
的组合来实现此结果。第一种方法输出一个布尔 numpy 数组,该数组的计算结果为 True
,其中它的 vlaues 等于一个类似数组的指定测试元素(参见 doc),而第二种方法您可以创建一个新数组,该数组设置一些指定 confition 计算为 True
的值和另一个值 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]])