如何从所有重叠数组的最大值创建一个掩码数组?



我有许多相同维度的2d数组。每个像素的值为0、1或23。每个数组的值分布在不同的位置。我想要一个最大掩码,这是覆盖所有数组并取每个位置的最大值的结果。我还想要一个效果相反的迷你面膜。如果这是个愚蠢的问题,我很抱歉……我试图搜索,但只得到的方法,以获得一个单一的最大/最小值在整个数组或在某个轴上。如果你能帮忙的话,提前感谢你!

我的数组很大,我将在这里给出一个简单的例子-

a = ([[0, 1, 0, 0, 23],
[1, 0, 0, 0, 1],
[23, 23, 0, 1, 1],
[1, 1, 23, 0, 1]])
b = ([[23, 1, 0, 1, 1],
[1, 0, 0, 23, 1],
[0, 23, 0, 23, 1],
[1, 1, 0, 0, 23]])
# After some coding, max_mask and min_mask should be:
max_mask = ([[23, 1, 0, 1, 23],
[1, 0, 0, 23, 1],
[23, 23, 0, 23, 1],
[1, 1, 23, 0, 23]])
min_mask = ([[0, 1, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 23, 0, 1, 1],
[1, 1, 0, 0, 1]])

因为我有太多的数组从泛型函数创建,他们被命名为data1985, data1986…data2020,有没有一种更简单的方法可以遍历它们?

# this is how I create them by reading images
for i in range(1985, 2021):
globals()[f"data{i}"], globals()[f"geo{i}"], globals()[f"proj{i}"]  = read_tif(r"C:UserswqtclDesktopREDDimages/" +str(i)+".tif")
globals()[f"data{i}"][np.isnan(globals()[f"data{i}"])]=23
# I want something like this (or easier!!)
# initialize array filled with zeros
mask = np.zeros([len(data1985), len(data1985[0])], dtype=int)
# populate array
for i in range(1985, 2021):
for j in range(len(data1985)):
for k in range(len(data1985[0])):
mask[j][k] = max(globals()[f"data{i}"][j][k])
# I got this error though...
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~AppDataLocalTemp/ipykernel_18020/2600759678.py in <module>
6     for j in range(len(data1985)):
7         for k in range(len(data1985[0])):
----> 8             mask[j][k] = max(globals()[f"data{i}"][j][k])
9 
10 print(mask)
TypeError: 'numpy.float32' object is not iterable

编辑:关于你的编辑,动态创建变量从来都不是一个好主意!将您的tif图像读入数组列表,然后使用我的解决方案。

path = r"C:UserswqtclDesktopREDDimages/{}.tif"
geo_data = {"data": [], "geo": [], "proj": []}

for i in range(1985, 2021):
data, geo, proj = read_tif(path.format(i))
geo_data["data"].append(data)
geo_data["geo"].append(geo)
geo_data["proj"].append(proj)

images = np.array(geo_data["data"])
images[np.isnan(images)] = 23.
max_mask = images.max(axis=0)
min_mask = images.min(axis=0)

请注意,我不能测试这个,因为我没有安装gdal,我没有一堆随机的.tif文件来测试这种方法。

原始解决方案

给你:

In [9]: a
Out[9]:
array([[ 0,  1,  0,  0, 23],
[ 1,  0,  0,  0,  1],
[23, 23,  0,  1,  1],
[ 1,  1, 23,  0,  1]])
In [10]: b
Out[10]:
array([[23,  1,  0,  1,  1],
[ 1,  0,  0, 23,  1],
[ 0, 23,  0, 23,  1],
[ 1,  1,  0,  0, 23]])
In [11]: np.maximum(a, b)
Out[11]:
array([[23,  1,  0,  1, 23],
[ 1,  0,  0, 23,  1],
[23, 23,  0, 23,  1],
[ 1,  1, 23,  0, 23]])
In [12]: np.minimum(a, b)
Out[12]:
array([[ 0,  1,  0,  0,  1],
[ 1,  0,  0,  0,  1],
[ 0, 23,  0,  1,  1],
[ 1,  1,  0,  0,  1]])

如果您需要为两个以上的数组这样做,您可以初始化一个3D数组并调用.max(axis=0):

In [15]: c
Out[15]:
array([[23,  0, 23,  1,  1],
[23, 23,  1,  0, 23],
[23,  1, 23,  1,  0],
[ 0,  0,  0, 23,  0]])
In [16]: d
Out[16]:
array([[23,  0,  0, 23, 23],
[ 1,  0,  1,  0, 23],
[ 0,  0, 23, 23,  0],
[ 1,  0, 23, 23,  0]])

In [17]: np.array([a, b, c, d]).max(axis=0)
Out[17]:
array([[23,  1, 23, 23, 23],
[23, 23,  1, 23, 23],
[23, 23, 23, 23,  1],
[ 1,  1, 23, 23, 23]])

最新更新