python - 如何从所有重叠数组的最大值创建掩码数组?
问题描述
我有许多相同维度的二维数组。每个像素的值是 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:\Users\wqtcl\Desktop\REDD\images/" +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)
~\AppData\Local\Temp/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:\Users\wqtcl\Desktop\REDD\images/{}.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]])
推荐阅读
- vue-cli-3 - 如何使用 TailwindCSS 为 vue-cli-3 项目配置 PurgeCSS?(包括响应类)
- php - CSS 行高规则被忽略
- php - 如何在 PHP 中的函数中仅在页面上回显一次?
- c# - 在同一网格中使用“PreviewMouseLeftButtonDown”事件时,“CurrentCellChanged”事件不起作用
- java - 如何通过Java将RelativeLayout添加到另一个RelativeLayout中?
- ionic-framework - ionic cli 4.5.0 样式属性不适用
- java - 如何通过 DB2 (v8.2) JDBC URL 修改编码字符?
- python - 如何检查正则表达式中多个点的最小/最大长度
- asp.net - 在 ASP.NET Razor 中,如何在字符串中包含模型属性?
- mysql - SQL - 如何显示产品的选项,无论它们是否有?