我有两个2D数字阵列,即每个(95,60)维度的lat和lon。我试图找到以下条件语句的索引。
ind = np.where(((lat >= 20.0 and lat <= 30.0) and (lon >= 90.0 and lon <= 100.0)))
我收到以下错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我的lat数组包含如下数据:
array([[ 19.13272095, 19.52386856, 19.8377533 , ..., 22.81465149,
22.80446053, 22.78530312],
[ 19.2490139 , 19.64085197, 19.95526123, ..., 22.93462563,
22.92414474, 22.90457916],
[ 19.36528587, 19.75781822, 20.07275009, ..., 23.05456543,
23.04379272, 23.02381706],
...,
[ 29.7395134 , 30.20263481, 30.57126617, ..., 33.85147858,
33.81478882, 33.75755692],
[ 29.85359764, 30.31761169, 30.68692398, ..., 33.97143555,
33.93445587, 33.87679672],
[ 29.9676609 , 30.4325695 , 30.80256653, ..., 34.09137726,
34.05410767, 33.99602509]], dtype=float32)
同样,lon数组包含如下数据:
array([[ 96.78914642, 98.04283905, 99.0661087 , ..., 119.39452362,
120.45418549, 121.74817657],
[ 96.75196075, 98.00632477, 99.03016663, ..., 119.37508392,
120.43569183, 121.73084259],
[ 96.71466064, 97.96970367, 98.99414062, ..., 119.35567474,
120.41724396, 121.71356201],
...,
[ 92.90063477, 94.2386322 , 95.33486176, ..., 117.72390747,
118.90248108, 120.34107971],
[ 92.85238647, 94.19155884, 95.2888031 , ..., 117.7070694 ,
118.88733673, 120.32800293],
[ 92.80393219, 94.14429474, 95.24256897, ..., 117.69021606,
118.87218475, 120.31491089]], dtype=float32)
我试图修改我的命令如下:
ind = np.where(((lat.all() >= 20.0 and lat.all() <= 30.0) and (lon.all() >= 90.0 and lon.all() <= 100.0)))
我得到以下空数组作为输出:
(array([], dtype=int64),)
我甚至尝试了以下内容:
ind = np.where(lat.all() >= 20.0 and lat.all() <= 30.0)
输出为:(array([], dtype=int64),)
我不明白如何解决我的问题。任何人都可以帮我解决我做错的方式和地点吗?
答案 0 :(得分:2)
这需要两个修复,()首先执行比较,并用元素and
替换标量&
ind = np.where((((lat >= 20.0) & (lat <= 30.0)) & ((lon >= 90.0) & (lon <= 100.0))))
当在需要标量布尔值的上下文中使用布尔数组时,会出现此ValueError。 if lat >= 20.0:
是常见的情况。 and
是一个Python短路运算符,因此实际上是if
测试。
我们还需要在(<=)
&
测试
只有lat
数组的一部分:
Out[48]: (array([], dtype=int32), array([], dtype=int32))
In [49]: np.where((((lat >= 20.0) & (lat <= 30.0))))
Out[49]:
(array([0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 4, 5], dtype=int32),
array([3, 4, 5, 3, 4, 5, 2, 3, 4, 5, 0, 0, 0], dtype=int32))
答案 1 :(得分:0)
从未喜欢过一大堆括号和符号。在这种情况下,我通常会使用functools.reduce
。
from functools import reduce
ind = np.where(reduce(np.logical_and , (lat >= 20.0 , lat <= 30.0 , lon >= 90.0 , lon <= 100.0)))