我有一个坐标数组
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)与数组中的任何位置都不匹配
答案 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
可以将坐标作为行,根据其他评论,这似乎是更自然的解决方案,但这取决于您如何使用此坐标。