Pythonic方法稀疏地随机填充数组?

2024-07-02 12:59:22 发布

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

问题: 用10 1,20 2,30 3随机填充一个10 x 10的0数组

实际上我不需要使用数组,我只需要值所在位置的坐标。它只是更容易从数组的角度来考虑。

我为此写了几个解决方案,但它们似乎都不是直截了当和非Python式的。我希望有人能给我一些启示。我的方法是使用0-99的线性数组,随机选择(np.随机选择)10个值,从数组中删除它们,然后选择20个随机值。之后,我把线性位置转换成(y,x)坐标。在

import numpy as np

dim = 10
grid = np.arange(dim**2)

n1 = 10
n2 = 20
n3 = 30

def populate(grid, n, dim):
    pos = np.random.choice(grid, size=n, replace=False)
    yx = np.zeros((n,2))
    for i in xrange(n):
        delPos = np.where(grid==pos[i])
        grid = np.delete(grid, delPos)
        yx[i,:] = [np.floor(pos[i]/dim), pos[i]%dim]
    return(yx, grid)

pos1, grid = populate(grid, n1, dim)
pos2, grid = populate(grid, n2, dim)
pos3, grid = populate(grid, n3, dim)

额外 假设当我填充1时,我希望它们都在“数组”的一半上,我可以使用我的方法(从网格采样[dim**2/2:]),但我还没有想出如何对其他建议执行相同的操作。在


Tags: 方法posnp线性数组grid角度dim
3条回答

您可以创建一个包含所有坐标的列表,^{}该列表并取其中的前60个坐标(10+20+30):

>>> import random
>>> coordinates = [(i, j) for i in xrange(10) for j in xrange(10)]
>>> random.shuffle(coordinates)
>>> coordinates[:60]
[(9, 5), (6, 9), (1, 5), ..., (0, 2), (5, 9), (2, 6)]

然后,可以使用前10个值插入10个值,后20个值用于插入20个值,剩余的20个值用于插入30个值。在

不确定这是否是“Python”,但这里有一个我用西门的部分答案想出的东西。在

import random

dim = 10
n1 = 10
n2 = 20
n3 = 30

coords = [[i,j] for i in xrange(dim) for j in xrange(dim)]

def setCoords(coords, n):
    pos = []
    for i in xrange(n):
        random.shuffle(coords)
        pos.append(coords.pop())
    return(coords, pos)

coordsTmp, pos1 = setCoords(coords[dim**2/2:], n1)
coords = coords[:dim**2/2] + coordsTmp
coords, pos2 = setCoords(coords, n2)
coords, pos3 = setCoords(coords, n3)

要生成数组,可以使用^{}。在

np.random.choice([0, 1, 2, 3], size=(10,10), p=[.4, .1, .2, .3])

然后可以转换为坐标。请注意,numpy.random.choice使用概率p生成一个随机样本,因此不能保证得到^{中的精确比例。在

额外

如果您想让所有的1都在数组的某一侧,可以生成两个随机数组,然后生成^{}。诀窍是稍微修改每边每个数的概率。在

^{pr2}$

这里,因为我把所有的1放在左边,所以我把1的概率加倍,并平均地减少每个数的概率。同样的逻辑也适用于创建另一面。在

相关问题 更多 >