如何将值随机保留为特定数字并在不更改任何其他内容的情况下用 2d numpy 数组中的无数据替换其余部分
How to randomly keep values to a specific numbers and replacing rest with no data in 2d numpy array without changing anything others
我是科学计算领域的新手。
我有一个 2D numpy 数组(比如,A),形状为 (11153L, 4218L)
,数据类型为 dtype('uint8')
。现在,我想将数据保存在一些(比如,10000)随机位置(行,列)和用no-data-value
填充其余部分-我该怎么做?
这里no-data-value
是从另一个环境变量中得到的,例如my_raster_nodata_values = dsc.noDataValue
您可以使用 np.random.choice
和可选的 arg replace
设置为 False
到 select 该数组总大小的唯一索引,并将其中的那些设置为no_data_value
。因此,一个实现将是 -
a.ravel()[np.random.choice(a.size,a.size-10000,replace=0)] = no_data_value
或者,我们可以使用 np.put
来使它更直观,像这样 -
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]])
我是科学计算领域的新手。
我有一个 2D numpy 数组(比如,A),形状为 (11153L, 4218L)
,数据类型为 dtype('uint8')
。现在,我想将数据保存在一些(比如,10000)随机位置(行,列)和用no-data-value
填充其余部分-我该怎么做?
这里no-data-value
是从另一个环境变量中得到的,例如my_raster_nodata_values = dsc.noDataValue
您可以使用 np.random.choice
和可选的 arg replace
设置为 False
到 select 该数组总大小的唯一索引,并将其中的那些设置为no_data_value
。因此,一个实现将是 -
a.ravel()[np.random.choice(a.size,a.size-10000,replace=0)] = no_data_value
或者,我们可以使用 np.put
来使它更直观,像这样 -
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]])