【问题标题】:Concatenate arrays of coordinates in Python在 Python 中连接坐标数组
【发布时间】:2021-05-30 13:58:26
【问题描述】:

我正在从多个 d 维立方体构建一个坐标数组。我想从一个空数组开始,并附加我在每个 for 循环中生成的坐标。但是,np.concatenate(和 vstack)需要一个现有的匹配维度数组。我也想保持维度而不是得到一个平面数组。

这是我想做的想法:

#sample from d-dimensional cube
def make_cubes(d, npoints, ncubes):
    cubes = []
    for i in range(ncubes):
        c = np.random.rand(npoints, d)     #sample from cube in d dimensions
        c += np.random.uniform(-5,5)   #random translation
        cubes = np.concatenate((cubes, c))
    return cubes

为了让它真正起作用,我必须将多维数据集定义为

cubes = [[]]
for d in range(d):
    cubes[0].append(np.nan)

【问题讨论】:

  • 那么,cubes 的最终形状是什么? (ncubes, npoints, d)?
  • 它们可以是任何东西,但例如我想要五个每个 100 点的 3 维立方体(d=3,ncubes=5,npoints=100)。所以 cubes.shape = (500,3)
  • 在循环中重复 np.concatenate 是个坏主意。请改用列表append
  • @900edges 整行毫无意义。形状为 (500, 3) 的数组是 2D 数组,而不是 3D。您还将知道基于输入的形状是什么,正如您所说的那样,它将是(npoints*ncubes, d)。但是,我认为您对 np.random.rand 的作用有误。它返回一个数组,其中包含您给它的形状的随机值。因此,如果您需要一个形状为 (500, 3) 的数组,那么您可以立即提出要求。
  • append 删除结构,给出一个扁平化的数组。在这种情况下,您将如何使用它? @hpaulj

标签: python arrays numpy concatenation


【解决方案1】:

正如 hpaulj 所说,您可以使用追加而不是连接。最后,您可以将数组重新整形为所需的形状。

#sample from d-dimensional cube
def make_cubes(d, npoints, ncubes):
    cubes = []
    for i in range(ncubes):
        c = np.random.rand(npoints, d)     #sample from cube in d dimensions
        c += np.random.uniform(-5,5)   #random translation
        cubes.append(c)
       
    cubes = np.reshape(cubes, (npoints*ncubes,d) )
    return cubes

例如

print( make_cubes(3,4,2) )

给我

[[-0.20605781  0.17759941 -0.54688093]
 [ 0.15476342 -0.47873276 -0.66528647]
 [ 0.05216092 -0.7118765  -0.2794354 ]
 [-0.648958   -0.49131152 -0.24827643]
 [ 3.80803203  3.41893782  3.66186498]
 [ 4.37535951  3.79385615  3.52051711]
 [ 3.98299149  4.17239746  4.09716118]
 [ 3.89030706  4.26959177  4.38166707]]

【讨论】:

    猜你喜欢
    • 2020-11-23
    • 2017-03-16
    • 2017-05-06
    • 2016-01-25
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    相关资源
    最近更新 更多