Еще Pythoni c способ построения случайных кластеров в Python - PullRequest
2 голосов
/ 07 марта 2020

Я хотел бы создать функцию, которая создаст случайный кластер с равномерным распределением, сосредоточенный вокруг набора координат и с указанным радиусом, я сделал это с помощью следующего:

import numpy as np

# create cluster builder
def cluster(center, radius=10, n=50):
    xx = np.random.uniform(center[0]-radius, center[0]+radius, size=n)
    yy = np.random.uniform(center[1]-radius, center[1]+radius, size=n)
    zz = np.random.uniform(center[2]-radius, center[2]+radius, size=n)
    return xx, yy, zz

# create random cluster
xx1, yy1, zz1 = cluster((25, 15, 5))

Это работает, как и ожидалось, но я просто чувствую, что они должны быть более Pythoni c способ построить функцию кластера. У кого-нибудь есть предложения?

Ответы [ 2 ]

4 голосов
/ 07 марта 2020

np.random.uniform также принимает low и high в качестве массивов / списков. Следовательно, мы можем просто сделать -

c = np.asarray(center)
xx,yy,zz = np.random.uniform(c-radius, c+radius, size=(n,3)).T

Если любая более старая версия поддерживает только скалярные low и high, мы можем использовать некоторое масштабирование -

xx,yy,zz = np.random.uniform(size=(3,n))*radius*2 + c[:,None] - radius
2 голосов
/ 07 марта 2020

Вы можете определить cluster(), чтобы он векторизовал все операции

def cluster(center, radius=10, n=50):
    center = np.atleast_1d(np.asarray(center))[:, None, None]
    radius = np.atleast_1d(np.asarray(radius))[None, :, None]
    shape = (center.shape[0], radius.shape[1], n)
    return np.random.uniform(center - radius, center + radius, size=shape)

и получить все значения за один вызов:

cluster(25, 10).shape  # (1, 1, 50)
cluster((25, 15, 5), 10).shape  # (3, 1, 50)
cluster((25, 15, 5), (10, 5)).shape  # (3, 2, 50)
cluster((25, 15, 5), (10, 5), n=100).shape  # (3, 2, 100)

Конечно, вы все равно можете разделить результат в xx, yy, zz:

xx, yy, zz = cluster((25, 15, 5), (10, 5), n=100)
xx.shape  # (2, 100)
yy.shape  # (2, 100)
zz.shape  # (2, 100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...