【问题标题】:Faster way to iteratively replace values in relatively large NumPy array在相对较大的 NumPy 数组中迭代替换值的更快方法
【发布时间】:2021-12-11 22:37:14
【问题描述】:

我有一个相对较大的 NumPy 数组 (1212,1612),其中包含对应于 RGB 图像的唯一段的 OBJECTID 值。此外,我有一个 107305 行的不同 Pandas 数据框,其中包含所有 OBJECTID 值及其对应的植被类型类,这些类是由随机森林分类产生的。我想(迭代地)用与该特定 OBJECTID 值对应的植被类型类替换 NumPy 数组中的 OBJECTID 值。

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]])

这个代码 sn-p 工作,但它非常慢,在 vegdata 数据帧中每 1000 行大约需要 30 秒,而我有 107305 行,在某些图像中大约是 10 倍。我正在调查是否有另一种方法来执行这种分析,但与此同时我还没有找到合适的方法,所以我想知道是否有人可能知道如何以更快的方式进行这种分析.

我是 StackOverflow 的新手,所以我尝试通过提供一些代码 sn-ps 使我的答案尽可能清晰,但如果有任何不清楚的地方,请告诉我。提前非常感谢!

【问题讨论】:

  • 这能回答你的问题吗newbedev.com/…
  • @sehan2 非常感谢您的回复!我正在研究它,但我发现很难将这个网站上的代码示例转换为我自己的数据并使其工作。如果它不会花费您太多的工作,您是否有可能使用我的数据名称转换其中一个示例?再次感谢您!

标签: python arrays numpy iteration classification


【解决方案1】:

给你:

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

【讨论】:

  • 嗨,Sehan,对不起,我的回复晚了,但非常感谢您的回复,确实大大提高了速度!
  • 不客气。如果您愿意,可以将您的问题标记为已回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2011-03-25
  • 2017-03-28
  • 1970-01-01
  • 2021-10-21
  • 2016-02-06
相关资源
最近更新 更多