如何将值随机保留为特定的数字,并在2dnumpy数组中用无数据替换rest,而不更改任何其他值

2024-03-28 21:45:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我是科学计算的新手。 我有一个2D numpy数组(比如a),其形状为(11153L, 4218L),数据类型为dtype('uint8')。现在,我想将数据保留在一些(比如,10000)随机位置(行,列),并用no-data-value填充其余的数据-我该怎么做?你知道吗

这里no-data-value来自另一个环境变量,例如my_raster_nodata_values = dsc.noDataValue


Tags: 数据nonumpydatavaluemy环境变量数组
1条回答
网友
1楼 · 发布于 2024-03-28 21:45:26

您可以使用^{}并将可选的arg 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]])

相关问题 更多 >