ndimage.filters.convolve
对一个数组(例如array1)进行卷积运算,然后如果生成的新数组(例如array2)超过一个随机数,那么另外一个数组(例如array3)将被赋值为1。一旦array3被赋值为1,它就会逐年计数,当它最终达到某个特定值(例如5)时,array1就会在这个位置上更新。
如果这有点令人困惑,我很抱歉。实际上,我已经通过使用numpy.where(boolean expression, value, value)
使脚本正常工作,但当我需要多个表达式时(例如where array2 == 1 and array3 == 0
),我使用了循环来迭代每个数组中的每个值。这在这个例子中非常好用,但是当我用更大的数组代替数组时(完整的脚本导入GIS网格并将其转换为数组),这个循环需要几分钟才能处理每一年的数据。由于我们需要在1000次中运行60年的模型,所以我需要找到一种更有效的处理这些数组的方法。
我尝试在numpy.where函数内使用多个表达式,但无法弄清楚如何让它工作。我还尝试过使用zip(array)将数组组合在一起,但无法更新它们,我认为这是因为它创建了数组元素的元组。
我已经附上了脚本副本,就像之前提到的,它可以完全满足我的需求。然而,它需要更高效的运行。如果有人有任何建议,那就太好了。这是我第一次用python发布帖子,所以我仍然认为自己是个初学者。
import numpy as np
from scipy import ndimage
import random
from pylab import *
###################### FUNCTIONS ###########################
def convolveArray1(array1, kern1):
newArray = ndimage.filters.convolve(array1, kern1, mode='constant')
return newArray
######################## MAIN ##############################
## Set the number of years
nYears = range(1,16)
## Cretae array1
array1 = np.zeros((10,10), dtype=np.int) # vegThreshMask
# Add some values to array1
array1[[4,4],[4,5]] = 8
array1[5,4] = 8
array1[5,5] = 8
## Create kerna; array
kernal = np.ones((3,3), dtype=np.float32)
## Create an empty array to be used as counter
array3 = np.zeros((10,10), dtype=np.int)
## iterate through nYears
for y, yea in enumerate(nYears):
# Create a random number for the year
randNum = randint(7, 40)
print 'The random number for year %i is %i' % (yea, randNum)
print
# Call the convolveArray function
convArray = convolveArray1(array1, kernal)
# Update array2 where it is greater than the random number
array2 = np.where(convArray > randNum, 1, 0)
print 'Where convArray > randNum in year %i' % (yea)
print array2
print
# Iterate through array2
for a, ar in enumerate(array2):
for b, arr in enumerate(ar):
if all(arr == 1 and array3[a][b] == 0):
array3[a][b] = 1
else:
if array3[a][b] > 0:
array3[a][b] = array3[a][b] + 1
if array3[a][b] == 5:
array1[a][b] = 8
# Remove the initial array (array1) from the updated array3
array3 = np.where(array1 > 0, 0, array3)
print 'New array3 after %i years' % (yea)
print '(Excluding initial array)'
print array3
print
print 'The final output of the initial array'
print array1
numpy
进行基本数组操作时,我会直接引导他们来这里。我预计会有加速,但没想到竟然达到了40倍的速度提升! - Hooked