Python:遍历数组的行和列
我在找一种简单有效的方法,用Python来按行和列遍历一个矩阵(二维数组)。
我有三个大小相同的二维矩阵:一个存放x坐标,一个存放y坐标,还有一个存放这些坐标对应的数据值(实际上是温度)。
我想遍历“数据”矩阵中的每一个元素,但需要记录当前的行和列,因为我还需要在“x”和“y”矩阵中查找对应的值。
为了更清楚,我在Matlab中会这样写:
for i = 1:nb_line
for j = 1:nb_column
if data(i,j) ~= 0
<operations using x[i,j] and y[i,j]>
end
end
end
在Python中,我想这样做:
for line in data:
for elt in line:
if not elt == 0:
<operations>
我的问题是,我在数组中丢失了当前的位置,因此无法调用x[i,j]或y[i,j]……
有没有简单的方法可以做到这一点?谢谢!
编辑:我的代码现在看起来是这样的。
DATA
、LAT
和LON
是netCDF4.variables,类似于二维掩膜数组,分别包含一个地理参数(温度、高度等等)、它的纬度和经度。
我想把这些数据投影到一个规则的纬度/经度网格上(例如,如果空间步长dlon
是0.5度,那么我的数组的第一列对应经度0度,第二列对应经度0.5度,第三列对应经度1.0度,依此类推……)。
sizeLon = (lonMax-lonMin)/dlon
sizeLat = (latMax-latMin)/dlat
Mp = numpy.ma.masked_array(zeros((sizeLat,sizeLon)),mask=True)
for rows in zip(LST,LAT,LON):
for lstVal, latVal,lonVal in zip(*rows):
if lstVal is not numpy.ma.masked:
lp = round(-(latVal-latMin)/dlat)
cp = round((lonVal-lonMin)/dlon)
Mp[lp,cp] = lstVal
2 个回答
2
听起来你想要的功能可能是 enumerate()
。这个函数可以让你在遍历一个集合的时候,同时得到每个值的索引(位置)和这个值本身:
for i, line in enumerate(data):
for j, elt in enumerate(line):
if not elt == 0:
<operations>
2
使用 enumerate 函数。
比如说,
>>> a = ['foo', 'bar', 'foorbar']
>>> for i, name in enumerate(a):
... print 'item %d is %s' % (i, name)
...
item 0 is foo
item 1 is bar
item 2 is foorbar
如果你其实不需要 i
和 j
这些值,只想要另一个矩阵中对应的条目,那么你可以考虑直接使用 zip 来合并行:
>>> b = [[1, 2], [3, 4]]
>>> x = [['foo', 'bar'], ['barFoo', 'fooBar']]
>>> for rows in zip(b, x):
... for bval, xval in zip(*rows):
... print 'bval: %d; xval: %s' % (bval, xval)
...
bval: 1; xval: foo
bval: 2; xval: bar
bval: 3; xval: barFoo
bval: 4; xval: fooBar