【问题标题】:Making For Loop over data name in python在python中对数据名称进行For循环
【发布时间】:2025-11-29 13:40:01
【问题描述】:

我有 .csv 格式的网格数据:

srcPath = "/data.csv"
f = open(srcPath,"r")
lines = f.readlines()
f.close()

miss  = -9999.
ny,nx = 360,720
dlat  = 0.5
dlon  = 0.5
lat0  = -90.0
lon0  = -180.0
Lat   = arange(-90, 90+0.001, dlat)
Lon   = arange(-180, 180+0.001, dlon)

a2dat0 = ones([ny,nx],float32)*miss
a2dat1 = ones([ny,nx],float32)*miss
a2dat3 = ones([ny,nx],float32)*miss
a2dat4 = ones([ny,nx],float32)*miss
a2dat5 = ones([ny,nx],float32)*miss
a2dat6 = ones([ny,nx],float32)*miss
for line in lines:
  lon, lat, v0,v1,v2,v3,v4,v5,v6 =map(float,line.split(","))
  x = int(floor((lon - lon0)/dlon))
  y = int(floor((lat - lat0)/dlat))
  a2dat0 [y,x] = v0
  a2dat1 [y,x] = v1
  a2dat2 [y,x] = v2
  a2dat3 [y,x] = v3
  a2dat4 [y,x] = v4
  a2dat5 [y,x] = v5
  a2dat6 [y,x] = v6
X, Y = meshgrid(Lon, Lat)
m= Basemap(projection='robin',llcrnrlon=-180.,llcrnrlat=-90.,urcrnrlon=180.,urcrnrlat=90.,resolution='i',lon_0=0)
xi, yi = m(X, Y)

现在我想在“a2dat”上放个屁:

  for i in range (0,7,1):
      print a2dat+str(i)+":" ,a2dat+str(i).shape

  for i in range (0,7,1):
      cs+str(i) = m.pcolor(xi,yi,a2dat+str(i),cmap=cmap, norm=norm, )

使用底图和“a2dat”数据绘制 7 个不同的全局地图,但它给出了返回错误,那么我该如何对这些数据名称进行循环呢?

【问题讨论】:

  • 错误是什么?
  • 当我只想在 for 循环中打印 "a2dat+str(i)" 时出错 "ufunc 'add' 不包含签名匹配类型 dtype('S32') dtype(' 的循环S32') dtype('S32')"
  • 使用列表 7 数组,您不必以非 Python 方式进行名称生成。
  • 如果代码已经写得很清楚,为什么要用这个循环和名称生成让它变得模糊呢?这是 python,不是没有列表或字典的原始语言。
  • @hpaulj 对不起,但我没有明白你的意思,这种 cmets 永远不会帮助任何人。我从其他人那里得到了答案。

标签: python numpy for-loop


【解决方案1】:

我认为您的动态名称可以替换为如下列表(这不是可运行的代码,因此可能存在一些错误):

data = [np.ones([ny,nx], float32)*miss for _ in range(7)]
# data = [a2dat0, a2dat1, ... a2dat6]    # or a list of the arrays
for line in lines:
  lon, lat, *vs =map(float,line.split(","))    # py3 * unpacking
  # vs = alist[2:] in py2?
  x = int(floor((lon - lon0)/dlon))
  y = int(floor((lat - lat0)/dlat))
  for d,v in zip(data, vs):
       d[y,x] = v

(一旦数组收集了一个列表,它们在全局环境中的名称(如果有的话)并不重要。)

for i,d  in enumerate(data):
     print("a2dat%d: "%i ,data.shape)

csdata = [m.pcolor(xi, yi, d, ...) for d in data]

虽然可以使用for i in range(...): 循环,但使用enumerate 生成索引更为惯用。我们鼓励考虑迭代对象列表,而不是这些元素的索引。

【讨论】:

    【解决方案2】:

    如果您想从字符串动态解释 python 代码,您需要使用evalexec。您的打印语句也是错误的,因为它不应该有:,并且第一个a2dat 应该是一个字符串,因为您只想获取文本(另请注意我添加了一个,)。

      for i in range (0,7):
          print "a2dat"+str(i)+":", eval("a2dat"+str(i)).shape
    

    eval("a2dat"+str(i)) 将在评估时为您获取数组对象。您可以自行阅读evalexec 之间的区别。

    【讨论】:

    • 谢谢您,print 这只是我的打字错误,但eval 是的,它有效。