Python提高了随机.samp

2024-09-28 01:33:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个函数来随机选择字典中存储的元素:

import random
from liblas import file as lasfile
from collections import defaultdict

def point_random_selection(list,k):
    try:
        sample_point = random.sample(list,k)
    except ValueError:
        sample_point = list
    return(sample_point)

def world2Pixel_Id(x,y,X_Min,Y_Max,xDist,yDist):
    col = int((x - X_Min)/xDist)
    row = int((Y_Max - y)/yDist)
    return("{0}_{1}".format(col,row))

def point_GridGroups(inFile,X_Min,Y_Max,xDist,yDist):
    Groups = defaultdict(list)
    for p in lasfile.File(inFile,None,'r'):
        id = world2Pixel_Id(p.x,p.y,X_Min,Y_Max,xDist,yDist)
        Groups[id].append(p)
    return(Groups)

其中k是要选择的元素数。团体就是字典

^{pr2}$

我的问题是这种方法非常慢(对于大约4天~800MB的文件)


Tags: samplefromimport元素return字典defrandom
1条回答
网友
1楼 · 发布于 2024-09-28 01:33:19

您可以尝试在读取坐标时更新样本。这至少可以避免在运行示例之前将所有内容存储在内存中。这并不能保证让事情变得更快。在

下面的代码基于BlkKnght's excellent answer从文件输入生成一个随机样本,而不保留所有行。这只是扩展了它以保留多个样本。在

import random
from liblas import file as lasfile
from collections import defaultdict


def world2Pixel_Id(x, y, X_Min, Y_Max, xDist, yDist):
    col = int((x - X_Min) / xDist)
    row = int((Y_Max - y) / yDist)
    return (col, row)

def random_grouped_samples(infile, n, X_Min, Y_Max, xDist, yDist):
    """Select up to n points *per group* from infile"""

    groupcounts = defaultdict(int)
    samples = defaultdict(list)

    for p in lasfile.File(inFile, None, 'r'):
        id = world2Pixel_Id(p.x, p.y, X_Min, Y_Max, xDist, yDist)
        i = groupcounts[id]
        r = random.randint(0, i)

        if r < n:
            if i < n:
                samples[id].insert(r, p)  # add first n items in random order
            else:
                samples[id][r] = p  # at a decreasing rate, replace random items

        groupcounts[id] += 1

    return samples

上面的函数接受inFile和边界坐标,以及样本大小n,并返回统一拾取的每个组中最多有n项的分组样本。在

因为您所使用的id是作为一个组键,所以我将其简化为只计算col, row元组,因此不需要将其设为字符串。在

您可以使用以下内容将这些内容写入文件:

^{pr2}$

相关问题 更多 >

    热门问题