在Python中使用条件语句查找2D数组的索引

时间:2017-03-15 06:37:45

标签: arrays python-2.7 numpy

我有两个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),)

我不明白如何解决我的问题。任何人都可以帮我解决我做错的方式和地点吗?

2 个答案:

答案 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)))