Как случайным образом получить позицию, соответствующую x, y, z? - PullRequest
0 голосов
/ 06 марта 2019

У меня есть массив координат

A_coor=(array([66, 67, 70, ..., 133, 133, 133]), 
        array([35, 35, 35, ..., 59,  59,  59]), 
        array([102,103,104, ...,105, 106, 107]))

Я хочу случайным образом выбрать k=2 позиции в массиве, чтобы сохранить координату.Например, если выбрана вторая позиция, выходное значение должно быть (67,35,103).

Я использую приведенную ниже функцию, но она не поддерживает положение

import numpy as np
A_coor=(([66, 67, 70, 133, 133, 133]), 
        ([35, 35, 35, 59,  59,  59]), 
        ([102,103,104,105, 106, 107]))
k=2
x = np.random.choice (A_coor[0], size=k)
y = np.random.choice (A_coor[1], size=k)
z = np.random.choice (A_coor[2], size=k)
print (x,y,z)

Вывод

[ 70 133] [35 35] [105 107]

Вы можете видеть, что (70,35,105) несопоставить с любым положением в массиве

Ответы [ 3 ]

1 голос
/ 06 марта 2019
import numpy as np 

A_corr=(np.array([66, 67, 70, 133, 133, 133]), 
        np.array([35, 35, 35, 59,  59,  59]), 
        np.array([102,103,104, 105, 106, 107]))

# convert to a more useful data structure
A_corr = np.array(A_corr).T 

# now generate random indices into A_corr (the zero axis) 
indices = np.random.choice(np.arange(A_corr.shape[0]),size=2)

# for k elements, do 
# indices = np.random.choice(np.arange(A_corr.shape[0]),size=k)

# finally select the elements (3-tuples) associated with indices 
A_corr[indices]

Преобразуйте ваш кортеж в массив, а затем транспонируйте его.Затем сгенерируйте индексный массив, используя np.random.choice

1 голос
/ 06 марта 2019

Преобразуйте ваш общий кортеж в массив, а затем используйте нарезку для получения координат.

import numpy as np

A_coor=(np.array([66, 67, 70, 133, 133, 133]), 
        np.array([35, 35, 35, 59,  59,  59]), 
        np.array([102,103,104, 105, 106, 107]))

column = np.random.choice(len(A_coor[0])) # Pick a random column index

coords = np.array(A_coor)[:, column]
print(column, coords)

Если вы хотите сделать это для нескольких столбцов, например, 10, то вы можете использовать понимание списка. Я не думаю, что для этого есть какой-то нудистский подход.

A_coor = np.array(A_coor)
columns = np.random.choice(np.arange(len(A_coor[0])), 
                           10, replace=True)

output = [A_coor[:, column] for column in columns]
0 голосов
/ 06 марта 2019

Вместо случайного выбора значений из ваших массивов, представьте в списке массивов координат уникальную матрицу (np.stack). Затем, что вам действительно нужно, это выборка k столбцов этой матрицы (то есть каждый столбец содержит тройку координат, которые вы хотите выбрать все вместе). Это можно сделать, используя np.random.choice из набора индексов столбцов (то есть len(A_coor[0]).

Избежание дубликатов можно получить с помощью свойства replace=False, которое должно быть задано как «не помещайте уже отобранные элементы обратно в элементы, отобранные далее».

Все вместе:

import numpy as np

A_coor=np.stack((np.array([66, 67, 70, 133, 133, 133]),
            np.array([35, 35, 35, 59,  59,  59]),
            np.array([102,103,104, 105, 106, 107])), axis=0)

k=2
column = np.random.choice(len(A_coor[0]), replace=False, size=k)  

coords = A_coor[:, column]
print(coords.T)

Использование coords.T позволяет вам иметь координаты в виде строк, что, согласно другим комментариям, кажется более естественным решением, но это зависит от того, как вам нужно использовать эти координаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...