Python 如何将值随机保留为特定的数字,并在2d numpy数组中用无数据替换rest,而不更改任何其他值
我是科学计算新手。 我有一个2D numpy数组(比如,a),形状为Python 如何将值随机保留为特定的数字,并在2d numpy数组中用无数据替换rest,而不更改任何其他值,python,arrays,python-2.7,numpy,arcpy,Python,Arrays,Python 2.7,Numpy,Arcpy,我是科学计算新手。 我有一个2D numpy数组(比如,a),形状为(11153L,4218L),数据类型为dtype('uint8')。现在,我想将数据保留在一些(比如,10000)随机位置(行,列),并用无数据值填充其余的数据-我该怎么做 此处,无数据值是从另一个环境变量获取的,例如,my_raster\u nodata\u values=dsc.nodata值您可以使用可选的arg替换设置为假,为该数组的总大小选择唯一索引,并将其中的索引设置为无数据值。因此,将需要实施- a.ravel(
(11153L,4218L)
,数据类型为dtype('uint8')
。现在,我想将数据保留在一些(比如,10000)随机位置(行,列),并用无数据值填充其余的数据-我该怎么做
此处,无数据值
是从另一个环境变量获取的,例如,my_raster\u nodata\u values=dsc.nodata值您可以使用可选的arg替换
设置为假
,为该数组的总大小选择唯一索引,并将其中的索引设置为无数据值
。因此,将需要实施-
a.ravel()[np.random.choice(a.size,a.size-10000,replace=0)] = no_data_value
或者,我们可以使用as使其更直观,就像这样-
np.put(a, np.random.choice(a.size,a.size-10000,replace=0), no_data_value)
S = a.size - N - (a == no_data_value).sum()
idx = np.random.choice(np.flatnonzero(a!=no_data_value),S,replace=0)
a.ravel()[idx] = no_data_value
运行示例应使其更易于理解-
In [94]: a # Input array
Out[94]:
array([[163, 80, 142, 169, 214],
[ 7, 59, 102, 104, 234],
[ 44, 143, 7, 30, 232],
[ 71, 15, 64, 42, 141]])
In [95]: no_data_value = 0 # No value specifier
In [98]: N = 10 # Number of elems to keep
In [99]: a.ravel()[np.random.choice(a.size,a.size-N,replace=0)] = no_data_value
In [100]: a
Out[100]:
array([[ 0, 0, 142, 0, 0],
[ 7, 0, 0, 104, 234],
[ 0, 0, 7, 30, 232],
[ 71, 0, 64, 0, 141]])
如果输入数组中已有一个或多个元素等于无数据\u值
,我们可能需要偏移基于该计数设置的元素数。所以,对于这种情况,我们会有一个修改过的版本,就像这样-
np.put(a, np.random.choice(a.size,a.size-10000,replace=0), no_data_value)
S = a.size - N - (a == no_data_value).sum()
idx = np.random.choice(np.flatnonzero(a!=no_data_value),S,replace=0)
a.ravel()[idx] = no_data_value
样本运行-
In [65]: a
Out[65]:
array([[240, 30, 61, 38, 145],
[ 91, 65, 108, 154, 118],
[155, 198, 65, 65, 189],
[248, 140, 154, 186, 186]])
In [66]: no_data_value = 65 # No value specifier
In [67]: N = 10 # Number of elems to keep
In [68]: S = a.size - N - (a == no_data_value).sum()
In [69]: idx = np.random.choice(np.flatnonzero(a!=no_data_value),S,replace=0)
In [70]: a.ravel()[idx] = no_data_value
In [71]: a
Out[71]:
array([[240, 30, 61, 38, 65],
[ 65, 65, 108, 65, 65],
[ 65, 198, 65, 65, 65],
[248, 140, 154, 186, 65]])
您可以使用可选的argreplace
设置为False
,为该数组的总大小选择唯一索引,并将其中的索引设置为no\u data\u value
。因此,将需要实施-
a.ravel()[np.random.choice(a.size,a.size-10000,replace=0)] = no_data_value
或者,我们可以使用as使其更直观,就像这样-
np.put(a, np.random.choice(a.size,a.size-10000,replace=0), no_data_value)
S = a.size - N - (a == no_data_value).sum()
idx = np.random.choice(np.flatnonzero(a!=no_data_value),S,replace=0)
a.ravel()[idx] = no_data_value
运行示例应使其更易于理解-
In [94]: a # Input array
Out[94]:
array([[163, 80, 142, 169, 214],
[ 7, 59, 102, 104, 234],
[ 44, 143, 7, 30, 232],
[ 71, 15, 64, 42, 141]])
In [95]: no_data_value = 0 # No value specifier
In [98]: N = 10 # Number of elems to keep
In [99]: a.ravel()[np.random.choice(a.size,a.size-N,replace=0)] = no_data_value
In [100]: a
Out[100]:
array([[ 0, 0, 142, 0, 0],
[ 7, 0, 0, 104, 234],
[ 0, 0, 7, 30, 232],
[ 71, 0, 64, 0, 141]])
如果输入数组中已有一个或多个元素等于无数据\u值
,我们可能需要偏移基于该计数设置的元素数。所以,对于这种情况,我们会有一个修改过的版本,就像这样-
np.put(a, np.random.choice(a.size,a.size-10000,replace=0), no_data_value)
S = a.size - N - (a == no_data_value).sum()
idx = np.random.choice(np.flatnonzero(a!=no_data_value),S,replace=0)
a.ravel()[idx] = no_data_value
样本运行-
In [65]: a
Out[65]:
array([[240, 30, 61, 38, 145],
[ 91, 65, 108, 154, 118],
[155, 198, 65, 65, 189],
[248, 140, 154, 186, 186]])
In [66]: no_data_value = 65 # No value specifier
In [67]: N = 10 # Number of elems to keep
In [68]: S = a.size - N - (a == no_data_value).sum()
In [69]: idx = np.random.choice(np.flatnonzero(a!=no_data_value),S,replace=0)
In [70]: a.ravel()[idx] = no_data_value
In [71]: a
Out[71]:
array([[240, 30, 61, 38, 65],
[ 65, 65, 108, 65, 65],
[ 65, 198, 65, 65, 65],
[248, 140, 154, 186, 65]])
够了!但是有没有办法不转换原始阵列?我的意思是性能问题,因为我将不得不使用近10000个光栅。put
比ravel
快吗?@SIslam不知道您所说的转换原始数组的意思是什么?如果你是说把no\u data\u value
放在原始数组中,我想这就是问题所在。如果不是,你能详细说明一下吗?@SIslam如果你指的是a.ravel()
,那么ravel()
仅仅是数组的一个视图,因此没有转换。可能是我的理解错误。我的意思是,我刚刚读到,ravel
返回一个平坦的数组,因此我认为它会转换原始数组,然后设置nodata值。@SIslam(a!=无数据值)。sum()
?很好!但是有没有办法不转换原始阵列?我的意思是性能问题,因为我将不得不使用近10000个光栅。put
比ravel
快吗?@SIslam不知道您所说的转换原始数组的意思是什么?如果你是说把no\u data\u value
放在原始数组中,我想这就是问题所在。如果不是,你能详细说明一下吗?@SIslam如果你指的是a.ravel()
,那么ravel()
仅仅是数组的一个视图,因此没有转换。可能是我的理解错误。我的意思是我刚刚读到,ravel
返回一个平坦的数组,因此我认为它会转换原始数组,然后设置nodata值。@SIslam(a!=无数据值)。sum()
?在问题解决后回滚更新节?在问题解决后回滚更新节?