我正在寻找一种简单有效的方法来按行和列迭代矩阵(2D数组)。使用Python。
我有3个相同大小的2D矩阵:一个包含x坐标,一个用于y坐标,另一个包含这些坐标处的某些数据(实际温度)的值。
我想迭代'data'矩阵的每个元素,但是通过跟踪当前行和列,因为我需要在'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,它们看起来像2-D蒙版数组,分别包含地理参数(温度,海拔,等等......) ,它的纬度和经度。
我想在常规纬度/经度网格上投影此数据(例如,如果空间步长dlon
为0.5度,则我的数组的第一列对应于经度0deg,第二列经度为0.5度,第三个1.0deg等...)。
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
答案 0 :(得分: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
值,而只需要另一个矩阵中的相应条目,您可能只想考虑zipping行:
>>> 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
答案 1 :(得分:2)
听起来你正在寻找的内容可能是enumerate()
,provides you集合中值的索引{{3}}与值一起重复:< / p>
for i, line in enumerate(data):
for j, elt in enumerate(line):
if not elt == 0:
<operations>