我正在尝试遍历一个包含许多NaN:的掩码数组
[[[-- -- -- ... -- -- --]
[-- -- -- ... -- -- --]
[-- -- -- ... -- -- --]
...
[-- 0.0 0.0 ... -- -- --]
[-- -- -- ... -- -- --]
[-- -- -- ... -- -- --]]
[[-- -- -- ... -- -- --]
[-- -- -- ... -- -- --]
[-- -- -- ... -- -- --]
...
[-- 0.0 0.0 ... -- -- --]
[-- -- -- ... -- -- --]
[-- -- -- ... -- -- --]]
[[-- -- -- ... -- -- --]
[-- -- -- ... -- -- --]
[-- -- -- ... -- -- --]
...
[-- 0.0 0.0 ... -- -- --]
[-- -- -- ... -- -- --]
[-- -- -- ... -- -- --]]
我已经创建了一个函数来使用CCD_ 1循环遍历这个掩码数组,该循环捕获1=<值<2=<值<4、4=<值<8、8<8.
# Define function to count the occurences of different DHW thresholds being crossed
def threshold_count (enso_events_dhw_thresholds_data):
# Create for loop to examine all data
for i in range(0,len(enso_events_dhw_thresholds_data)):
# Define different threshold counts
enso_event_dhw_1_count = 0
enso_event_dhw_2_count = 0
enso_event_dhw_4_count = 0
enso_event_dhw_8_count = 0
# Define if statements to segment different threshold counts
if (1 <= enso_events_dhw_thresholds_data[i] < 2):
enso_event_dhw_1_count = enso_event_dhw_1_count + 1
if (2 <= enso_events_dhw_thresholds_data[i] < 4):
enso_event_dhw_2_count = enso_event_dhw_2_count + 1
if (8 <= enso_events_dhw_thresholds_data[i] < 8):
enso_event_dhw_4_count = enso_event_dhw_4_count + 1
if (8 <= enso_events_dhw_thresholds_data[i]):
enso_event_dhw_8_count = enso_event_dhw_8_count + 1
return enso_event_dhw_1_count, enso_event_dhw_2_count, enso_event_dhw_4_count, enso_event_dhw_8_count`
然而,当使用此功能时,我会得到
ValueError:具有多个元素的数组的真值不明确。使用.any((或.all((.
我如何才能克服这一点?
一个包含许多Nan 的掩码数组
您错了-您显示的数组包含数组数组,而不是数字或NaN。一个简单的纠正是用扁平数据调用函数,例如,如果变量z
包含您的数据:
… threshold_count(np.ravel(z))
-那么该函数当然在不同阈值计数的初始化被移动到循环之外之后工作。
但是循环并不能很好地利用NumPy。这种实现应该更好:
def threshold_count(enso_events_dhw_thresholds_data):
enso_event_dhw_1_count = np.sum((1 <= enso_events_dhw_thresholds_data) & (enso_events_dhw_thresholds_data < 2))
enso_event_dhw_2_count = np.sum((2 <= enso_events_dhw_thresholds_data) & (enso_events_dhw_thresholds_data < 4))
enso_event_dhw_4_count = np.sum((4 <= enso_events_dhw_thresholds_data) & (enso_events_dhw_thresholds_data < 8))
enso_event_dhw_8_count = np.sum( 8 <= enso_events_dhw_thresholds_data )
return enso_event_dhw_1_count, enso_event_dhw_2_count, enso_event_dhw_4_count, enso_event_dhw_8_count
比这更好的是使用例如numpy.histogram
,这使得任务变得如此简单,以至于定义一个函数不再有用:
… np.histogram(z, (1, 2, 4, 8, np.inf))