2024-03-28 21:45:26 发布
网友
我是科学计算的新手。 我有一个2D numpy数组(比如a),其形状为(11153L, 4218L),数据类型为dtype('uint8')。现在,我想将数据保留在一些(比如,10000)随机位置(行,列),并用no-data-value填充其余的数据-我该怎么做?你知道吗
(11153L, 4218L)
dtype('uint8')
no-data-value
这里no-data-value来自另一个环境变量,例如my_raster_nodata_values = dsc.noDataValue
my_raster_nodata_values = dsc.noDataValue
您可以使用^{}并将可选的arg replace设置为False,为该数组的总大小选择唯一索引,并将其中的索引设置为no_data_value。因此,一项实施将是——
replace
False
no_data_value
a.ravel()[np.random.choice(a.size,a.size-10000,replace=0)] = no_data_value
或者,我们可以使用^{}使其更直观,例如-
np.put(a, np.random.choice(a.size,a.size-10000,replace=0), 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]])
如果输入数组中已有一个或多个等于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]])
您可以使用^{} 并将可选的arg
replace
设置为False
,为该数组的总大小选择唯一索引,并将其中的索引设置为no_data_value
。因此,一项实施将是——或者,我们可以使用^{} 使其更直观,例如-
样本运行应该更容易理解-
如果输入数组中已有一个或多个等于
no_data_value
的元素,则我们可能需要根据该计数偏移要设置的元素数。所以,对于这种情况,我们会有一个修改过的版本,像这样-样本运行-
相关问题 更多 >
编程相关推荐