有条件的numpy.cumsum?

Ver*_*rix 9 python arrays gis numpy cumsum

我对python和numpy很新,很抱歉如果我误用了一些术语.

我已经将光栅转换为2D numpy数组,希望能快速高效地对其进行计算.

  • 我需要在numpy数组中得到累积和,这样,对于每个值,我生成所有小于或等于该值的值的总和,并将该值写入新数组.我需要以这种方式遍历整个阵列.

  • 我还需要在1到100之间缩放输出,但这看起来
    更简单.

尝试通过示例澄清:

array([[ 4,  1  ,  3   ,  2] dtype=float32)
Run Code Online (Sandbox Code Playgroud)

我想要输出值(只是手工做第一行)来读取:

array([[ 10,  1  ,  6   ,  3], etc.
Run Code Online (Sandbox Code Playgroud)

有关如何做到这一点的任何想法?

提前致谢!


对于任何有兴趣的人来说,近乎完成的脚本:

#Generate Cumulative Thresholds
#5/15/14

import os
import sys
import arcpy
import numpy as np

#Enable overwriting output data
arcpy.env.overwriteOutput=True

#Set working directory
os.chdir("E:/NSF Project/Salamander_Data/Continuous_Rasters/Canadian_GCM/2020/A2A/")

#Set geoprocessing variables
inRaster = "zero_eurycea_cirrigera_CA2A2020.tif"
des = arcpy.Describe(inRaster)
sr = des.SpatialReference
ext = des.Extent
ll = arcpy.Point(ext.XMin,ext.YMin)

#Convert GeoTIFF to numpy array
a = arcpy.RasterToNumPyArray(inRaster)

#Flatten for calculations
a.flatten()

#Find unique values, and record their indices to a separate object
a_unq, a_inv = np.unique(a, return_inverse=True)

#Count occurences of array indices
a_cnt = np.bincount(a_inv)

#Cumulatively sum the unique values multiplied by the number of
#occurences, arrange sums as initial array
b = np.cumsum(a_unq * a_cnt)[a_inv]

#Divide all values by 10 (reverses earlier multiplication done to
#facilitate accurate translation of ASCII scientific notation
#values < 1 to array)
b /= 10

#Rescale values between 1 and 100
maxval = np.amax(b)
b /= maxval
b *= 100

#Restore flattened array to shape of initial array
c = b.reshape(a.shape)

#Convert the array back to raster format
outRaster = arcpy.NumPyArrayToRaster(c,ll,des.meanCellWidth,des.meanCellHeight)

#Set output projection to match input
arcpy.DefineProjection_management(outRaster, sr)

#Save the raster as a TIFF
outRaster.save("C:/Users/mkcarte2/Desktop/TestData/outRaster.tif")

sys.exit()
Run Code Online (Sandbox Code Playgroud)

Jai*_*ime 11

根据您希望如何处理重复,这可能有效:

In [40]: a
Out[40]: array([4, 4, 2, 1, 0, 3, 3, 1, 0, 2])

In [41]: a_unq, a_inv = np.unique(a, return_inverse=True)

In [42]: a_cnt = np.bincount(a_inv)

In [44]: np.cumsum(a_unq * a_cnt)[a_inv]
Out[44]: array([20, 20,  6,  2,  0, 12, 12,  2,  0,  6], dtype=int64)
Run Code Online (Sandbox Code Playgroud)

a你的阵列当然在哪里被压平,然后你必须重新塑造成原始的形状.


当然,一旦numpy 1.9出局,你可以将上面的第41和42行压缩成单个,更快:

a_unq, a_inv, a_cnt = np.unique(a, return_inverse=True, return_counts=True)
Run Code Online (Sandbox Code Playgroud)