Python:遍历数组的行和列

1 投票
2 回答
860 浏览
提问于 2025-04-18 01:11

我在找一种简单有效的方法,用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]……

有没有简单的方法可以做到这一点?谢谢!


编辑:我的代码现在看起来是这样的。

DATALATLON是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

如果你其实不需要 ij 这些值,只想要另一个矩阵中对应的条目,那么你可以考虑直接使用 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

撰写回答