在相对较大的 NumPy 数组中迭代替换值的更快方法
Faster way to iteratively replace values in relatively large NumPy array
我有一个相对较大的 NumPy 数组 (1212,1612),其中包含对应于 RGB 图像的独特片段的 OBJECTID 值。此外,我有一个不同的 Pandas 数据框,包含 107305 行,其中包含所有 OBJECTID 值及其相应的植被类型 class,这是由随机森林 class 化产生的。我想(迭代地)将 NumPy 数组中的 OBJECTID 值替换为与该特定 OBJECTID 值相对应的植被类型 class。
NumPy 数组 ('array') 如下所示:
[1,1,1,1,2,2,2,2,3,3,...
1,1,1,1,1,2,2,2,3,3,...
1,1,2,4,4,4,2,2,3,3,...] # values 1-4 correspond to OBJECTID
pandas 数据框 ('vegdata') 看起来像:
VEG_TYPE OBJECTID
Shrub (S) 1
Grass (G) 2
Moss (M) 3
Grass (G) 4
... ... ...
我希望数据最终的样子如下:
[S,S,S,S,G,G,G,G,M,M,...
S,S,S,S,S,G,G,G,M,M,...
S,S,G,G,G,G,G,G,M,M,...]
我目前正在做的是:
for row in vegdata.itertuples():
np.where(array[[array == row.OBJECTID]], row.VEG_TYPE,
array[[array == row.OBJECTID]])
此代码片段有效,但速度非常慢,在 vegdata 数据框中每 1000 行大约需要 30 秒,而我有 107305 行,在某些图像中大约是它的十倍。我正在调查是否有执行此分析的替代方法,但与此同时我找不到合适的方法,所以我想知道是否有人知道如何以更快的方式进行此类分析.
我是 Whosebug 的新手,所以我试图通过提供一些代码片段来尽可能清楚地回答我的问题,但如果有任何不清楚的地方,请告诉我。提前致谢!
给你:
import numpy as np
import pandas as pd
VEG_TYPE = ['Shrub (S)','Grass (G)','Moss (M)','Grass (G)']
OBJECTID = [1 ,2 ,3 ,4]
mapping= {k:v for k,v in zip(OBJECTID, VEG_TYPE)}
input_array = np.random.randint(1,5, (10,10))
out = np.empty(input_array.shape, dtype=np.dtype('U100'))
for key,val in mapping.items():
out[input_array==key] = val
我有一个相对较大的 NumPy 数组 (1212,1612),其中包含对应于 RGB 图像的独特片段的 OBJECTID 值。此外,我有一个不同的 Pandas 数据框,包含 107305 行,其中包含所有 OBJECTID 值及其相应的植被类型 class,这是由随机森林 class 化产生的。我想(迭代地)将 NumPy 数组中的 OBJECTID 值替换为与该特定 OBJECTID 值相对应的植被类型 class。
NumPy 数组 ('array') 如下所示:
[1,1,1,1,2,2,2,2,3,3,...
1,1,1,1,1,2,2,2,3,3,...
1,1,2,4,4,4,2,2,3,3,...] # values 1-4 correspond to OBJECTID
pandas 数据框 ('vegdata') 看起来像:
VEG_TYPE OBJECTID
Shrub (S) 1
Grass (G) 2
Moss (M) 3
Grass (G) 4
... ... ...
我希望数据最终的样子如下:
[S,S,S,S,G,G,G,G,M,M,...
S,S,S,S,S,G,G,G,M,M,...
S,S,G,G,G,G,G,G,M,M,...]
我目前正在做的是:
for row in vegdata.itertuples():
np.where(array[[array == row.OBJECTID]], row.VEG_TYPE,
array[[array == row.OBJECTID]])
此代码片段有效,但速度非常慢,在 vegdata 数据框中每 1000 行大约需要 30 秒,而我有 107305 行,在某些图像中大约是它的十倍。我正在调查是否有执行此分析的替代方法,但与此同时我找不到合适的方法,所以我想知道是否有人知道如何以更快的方式进行此类分析.
我是 Whosebug 的新手,所以我试图通过提供一些代码片段来尽可能清楚地回答我的问题,但如果有任何不清楚的地方,请告诉我。提前致谢!
给你:
import numpy as np
import pandas as pd
VEG_TYPE = ['Shrub (S)','Grass (G)','Moss (M)','Grass (G)']
OBJECTID = [1 ,2 ,3 ,4]
mapping= {k:v for k,v in zip(OBJECTID, VEG_TYPE)}
input_array = np.random.randint(1,5, (10,10))
out = np.empty(input_array.shape, dtype=np.dtype('U100'))
for key,val in mapping.items():
out[input_array==key] = val