如何随机获得对应于x,y,z的位置?

时间:2019-03-05 22:54:26

标签: python numpy

我有一个坐标数组

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 个答案:

答案 0 :(得分:1)

将整个元组转换为数组,然后使用切片获取坐标。

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,那么您可以使用列表推导。我认为没有原生的numpy方法可以做到这一点。

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]

答案 1 :(得分:1)

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

生成索引数组

答案 2 :(得分:0)

与其在数组中随机选择值,不如在坐标数组列表中将其视为唯一矩阵(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可以将坐标作为行,根据其他评论,这似乎是更自然的解决方案,但这取决于您如何使用此坐标。