python - 在numpy中生成一个n维坐标数组

标签 python numpy multidimensional-array iterator coordinates

假设我有一个函数 f,它可以将坐标作为参数并返回一个整数(在本例中为 f(x))。坐标可以是多维的,以列表的形式存在。我的目标是用两个坐标之间的所有值填充一个 numpy 数组。我试图列出所有可能的索引并将其用作矢量化函数的输入。

这是我的二维坐标代码:

import itertools
import numpy


def index_array(lower_corner, upper_corner):
     x_range = range(lower_corner[0], upper_corner[0])
     y_range = range(lower_corner[1], upper_corner[1])
     return numpy.array(list(itertools.product(x_range, y_range)))


print(index_array([2, -2], [5, 3]))

这将像预期的那样返回索引列表:

[[ 2 -2]
 [ 2 -1]
 [ 2  0]
 [ 2  1]
 [ 2  2]
 [ 3 -2]
 [ 3 -1]
 [ 3  0]
 [ 3  1]
 [ 3  2]
 [ 4 -2]
 [ 4 -1]
 [ 4  0]
 [ 4  1]
 [ 4  2]]

这是我对 n 维的尝试:

import itertools
import numpy


def f(x):
    # dummy function
    return x + 5


def index_array(lower_corner, upper_corner):
    # returns all indices between two n-dimensional points
    range_list = []
    for n in range(len(lower_corner)):
        range_list.append(range(lower_corner[n], upper_corner[n]))
    return numpy.array(list(itertools.product(*range_list)))


lower_corner = numpy.array([2, -2])
upper_corner = numpy.array([5, 3])
indices = index_array(lower_corner, upper_corner)
vect_func = numpy.vectorize(f)
results = vect_func(indices)
print(results)

虽然这可行,但速度很慢并且需要大量内存。有没有可能以更有效的方式编写它?我可以考虑使用 numpy.meshgrid,但我不知道如何使用它。

最佳答案

确实np.meshgrid将是通过一些堆叠来实现的一种方法,如下所示-

def ndim_grid(start,stop):
    # Set number of dimensions
    ndims = len(start)

    # List of ranges across all dimensions
    L = [np.arange(start[i],stop[i]) for i in range(ndims)]

    # Finally use meshgrid to form all combinations corresponding to all 
    # dimensions and stack them as M x ndims array
    return np.hstack((np.meshgrid(*L))).swapaxes(0,1).reshape(ndims,-1).T

样本运行

1) 2D 案例:

In [97]: ndim_grid([2, -2],[5, 3])
Out[97]: 
array([[ 2, -2],
       [ 2, -1],
       [ 2,  0],
       [ 2,  1],
       [ 2,  2],
       [ 3, -2],
       [ 3, -1],
       [ 3,  0],
       [ 3,  1],
       [ 3,  2],
       [ 4, -2],
       [ 4, -1],
       [ 4,  0],
       [ 4,  1],
       [ 4,  2]])

2) 3D 案例:

In [98]: ndim_grid([2, -2, 4],[5, 3, 6])
Out[98]: 
array([[ 2, -2,  4],
       [ 2, -2,  5],
       [ 2, -1,  4],
       [ 2, -1,  5],
       [ 2,  0,  4],
       [ 2,  0,  5],
       [ 2,  1,  4],
       [ 2,  1,  5],
       [ 2,  2,  4],
       [ 2,  2,  5],
       [ 3, -2,  4],
       [ 3, -2,  5],
       [ 3, -1,  4],
       [ 3, -1,  5],
       [ 3,  0,  4],
       [ 3,  0,  5],
       [ 3,  1,  4],
       [ 3,  1,  5],
       [ 3,  2,  4],
       [ 3,  2,  5],
       [ 4, -2,  4],
       [ 4, -2,  5],
       [ 4, -1,  4],
       [ 4, -1,  5],
       [ 4,  0,  4],
       [ 4,  0,  5],
       [ 4,  1,  4],
       [ 4,  1,  5],
       [ 4,  2,  4],
       [ 4,  2,  5]])

关于python - 在numpy中生成一个n维坐标数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38170188/

相关文章:

c++ - 井字游戏二维数组

c - 多维数组的typedef?

linux - 段错误(核心转储)代码显示此错误

python - 如何修复 "TypeError: len() of unsized object"

python 在 Windows 和 Unix 上处理 long int 的方式不同

python - 对行的非零元素执行 numpy 乘积

python - numpy 无法识别转换中的数据类型

python - 使用 Python 3.x 在 Pandas 中使用零和常量值扩展/填充时间序列数据

python - 编写一组将使用存储在其他地方的数据的函数

python - 如何解决 Matplotlib 类型错误 : only integer scalar arrays can be converted to a scalar index