【问题标题】:How to effectively generate an array of tuples using numpy [duplicate]如何使用 numpy [重复] 有效地生成元组数组
【发布时间】:2019-11-06 13:56:12
【问题描述】:

我想使用 numpy.arange() 并专门使用 numpy 函数 有效地生成一个 numpy 元组数组,其大小是每个轴的维度的倍数.例如:下面a_list的大小为ma​​x_i*max_j*max_k

此外,我想为下面的示例获取的数组如下所示:[(0,0,0), (0,0,1), ..., (0, 0, 9), (0, 1, 0), (0, 1, 1), ..., (9, 4, 14)]

a_list = list()
max_i = 10
max_j = 5
max_k = 15

for i in range(0, max_i):
  for j in range(0, max_j):
    for k in range(0, max_k):
      a_list.append((i, j, k))

上面的循环的复杂度,依赖于 list 和 for 循环,是 O(max_i*max_j*max_k),我想使用分解的方式在 numpy.xml 中生成一个相似的元组数组。有可能吗?

【问题讨论】:

  • 元组基本上是 python 的一部分,而不是 numpy。你可以使用 3d 维度的数组吗?或者反过来,itertools?
  • 从技术上讲,你的操作是 O(m * n * p),而不是 O(n * n * n),因为你大概有三个独立的量。三重循环具有最佳复杂度。即使使用 numpy,你也不会比每个变量的线性时间做得更好。
  • 是的,谢谢你的最后一句话,我会纠正这个
  • 你可以用np.indices((max_i,max_j,max_k)).transpose(1,2,3,0).reshape(-1,3)得到一个二维数组。
  • 另外,k 变化最快,所以第二个元素将是(0, 0, 1),而不是(1, 0, 0)

标签: arrays python-3.x numpy tuples


【解决方案1】:

我更喜欢 Divakar 在 cmets 中的解决方案,但这是另一个。

您所描述的是cartesian product。在this post 的帮助下,您可以通过以下方式实现此目的

import numpy as np

# Input
max_i, max_j, max_k = (10, 5, 15)

# Build sequence arrays 0, 1, ... N
arr_i = np.arange(0, max_i)
arr_j = np.arange(0, max_j)
arr_k = np.arange(0, max_k)

# Build cartesian product of sequence arrays
grid = np.meshgrid(arr_i, arr_j, arr_k)
cartprod = np.stack(grid, axis=-1).reshape(-1, 3)

# Convert to list of tuples
result = list(map(tuple, cartprod))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2019-05-10
    • 2020-01-25
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多