Python 条件numpy.cumsum?

Python 条件numpy.cumsum?,python,arrays,numpy,gis,cumsum,Python,Arrays,Numpy,Gis,Cumsum,我对python和numpy非常陌生,所以如果我误用了一些术语,我很抱歉 我已将光栅转换为2D numpy阵列,希望能快速高效地对其进行计算 我需要得到一个numpy数组的累积和,比如 对于每个值,我生成小于或等于的所有值的总和 等于该值,并将该值写入新数组。我需要骑自行车 以这种方式穿过整个阵列 我还需要在1到100之间调整输出,但这似乎 更直接 试图举例说明: array([[ 4, 1 , 3 , 2] dtype=float32) 我希望输出值(仅手动执行第一行)为:

我对python和numpy非常陌生,所以如果我误用了一些术语,我很抱歉

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

  • 我需要得到一个numpy数组的累积和,比如 对于每个值,我生成小于或等于的所有值的总和 等于该值,并将该值写入新数组。我需要骑自行车 以这种方式穿过整个阵列

  • 我还需要在1到100之间调整输出,但这似乎
    更直接

试图举例说明:

array([[ 4,  1  ,  3   ,  2] dtype=float32)
我希望输出值(仅手动执行第一行)为:

有什么办法吗

提前谢谢


为感兴趣的人准备的即将完成的脚本:

#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()
#生成累积阈值
#5/15/14
导入操作系统
导入系统
导入arcpy
将numpy作为np导入
#启用覆盖输出数据
arcpy.env.overwriteOutput=True
#设置工作目录
os.chdir(“E:/NSF项目/蝾螈数据/连续光栅/加拿大GCM/2020/A2A/”)
#设置地理处理变量
InMaster=“zero\u eurycea\u cirrigera\u CA2A2020.tif”
des=arcpy.描述(主)
sr=des.空间参考
ext=des.区段
ll=arcpy.点(ext.XMin,ext.YMin)
#将GeoTIFF转换为numpy数组
a=arcpy.RasterToNumPyArray(主)
#为计算而展平
a、 展平()
#找到唯一的值,并将其索引记录到单独的对象
a_unq,a_inv=np.unique(a,return_inverse=True)
#计数数组索引的出现次数
a\u cnt=np.bincount(a\u inv)
#将唯一值乘以
#发生时,将总和排列为初始数组
b=np.cumsum(a_unq*a_cnt)[a_inv]
#将所有值除以10(与之前对
#促进ASCII科学符号的准确翻译
#值<1到数组)
b/=10
#重新缩放介于1和100之间的值
maxval=np.amax(b)
b/=maxval
b*=100
#将展平阵列恢复为初始阵列的形状
c=b.重塑(a.形状)
#将阵列转换回光栅格式
outRaster=arcpy.NumpyarRayTorMaster(c、ll、des.meanCellWidth、des.meanCellHeight)
#设置输出投影以匹配输入
arcpy.DefineProjection_管理(outRaster,sr)
#将光栅另存为TIFF
保存(“C:/Users/mkcare2/Desktop/TestData/outRaster.tif”)
sys.exit()
编辑:

这很难看,但我认为它最终会起作用:

import numpy as np

def cond_cum_sum(my_array):
    my_list = []
    prev = -np.inf
    prev_sum = 0
    for ele in my_array:
        if prev != ele:
            prev_sum += ele
        my_list.append(prev_sum)
        prev = ele
    return np.array(my_list)

a = np.array([[4,2,2,3],
              [9,0,5,2]], dtype=np.float32)

flat_a = a.flatten()
flat_a.sort() 

temp = np.argsort(a.ravel())   

cum_sums = cond_cum_sum(flat_a)

result_1 = np.zeros(len(flat_a))
result_1[temp] = cum_sums

result = result_1.reshape(a.shape)
结果:

>>> result
array([[  9.,   2.,   2.,   5.],
       [ 23.,   0.,  14.,   2.]])

根据您希望如何处理重复,这可能会起作用:

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)
当然,
a
是阵列展平的,然后必须将其重塑为原始形状


当然,一旦numpy 1.9发布,您可以将上面的第41行和第42行压缩为一个更快的:

a_unq, a_inv, a_cnt = np.unique(a, return_inverse=True, return_counts=True)

使用更少的numpy和更多的python:

a = np.array([[4,2,2,3],
              [9,0,5,2]], dtype=np.float32)

np.array([[sum(x for x in arr if x <= subarr) for subarr in arr] for arr in a])
# array([[ 11.,   4.,   4.,   7.],
#        [ 16.,   0.,   7.,   2.]])
a=np.array([[4,2,2,3],
[9,0,5,2]],dtype=np.32)
np.array([[sum(x代表arr中的x,如果x这个如何:

a=np.array([ 4,  1  ,  3   ,  2])

np.array([np.sum(a[a<=x])for x in a])

对于二维数组(假设需要整个数组的和,而不仅仅是行):


你能举一个例子吗?例如,一个小的1D或2D数组,你希望输出什么?因为你的问题目前还不清楚你在问什么。欢迎来到StackOverflow。如果你提供一个简单的输入和所需的输出,你的问题会更清楚。希望这会有帮助。谢谢你的输入。它仍然不是特别清楚,si一旦对示例数据进行了排序,
array([[4,1],[3,2]]会发生什么情况
?正确,它是2D。模式是:对于每个值,将整个数组中小于或等于它的所有值求和。将这些值写入一个新数组。感谢您的输入。我认为我的示例是误导性的,因为我任意对数据进行了排序。实际数据不会进行排序。@Akavall按照相同的思路思考,但我认为这是f如果任何值相等,则会出现问题。@M4rtini,是的,如果任何值相等,则不起作用。如果我不能快速找到答案,我将删除我的答案。答案不应该是
[11,4,4,7]
?还是我错过了唯一值必须求和的部分?@njzk2,OP在哪里说只有唯一值必须求和?我的理解是每个值只能加一次。呵呵,我刚刚得出了完全相同的答案。Figures@Jaime,
np.unique
的大师将首先到达那里。我感觉到他的作品比我的杰作更干净、更有效率:)。非常好的代码。我还在考虑是否能成功运行它。谢谢你的帮助!你能发布准确的代码,并在某处对错误进行完整的回溯吗?我刚刚重新运行了上面的代码,没有发现任何问题,你能再检查一遍你的代码中是否有拼写错误或缺少括号吗?我的理解(可能不正确)OP感兴趣的是整个数组的
cumsum
,而不是单独的行。
np.array([[sum(set(x for x in arr if x <= subarr)) for subarr in arr] for arr in a]) 
# array([[  9.,   2.,   2.,   5.],
#        [ 16.,   0.,   7.,   2.]])
a=np.array([ 4,  1  ,  3   ,  2])

np.array([np.sum(a[a<=x])for x in a])
array([10,  1,  6,  3])
a=np.array([[ 4,  1  ,  3   ,  2],[ 5,  1  ,  3   ,  2]])

np.array([[np.sum(a[a<=x])for x in a[y,:]]for y in range(a.shape[0])])
array([[16,  2, 12,  6],
       [21,  2, 12,  6]])