如何生成元素为自身坐标向量、shape为(n,)*n的NumPy数组?
解决方案
你遇到的问题是因为numpy.fromfunction会将函数返回的序列(比如list、tuple)拆解为多个独立数组,而不是合并成一个带最后一维的数组。要生成每个元素为自身坐标向量的数组,有两种简洁的方法:
方法1:改进fromfunction的函数逻辑
让lambda函数返回一个堆叠后的数组,把各个坐标维度合并到最后一维:
import numpy as np def coords(n): M = np.fromfunction( lambda *i: np.stack(i, axis=-1), shape=(n,)*n ) return M
调用coords(2)会得到你期望的结果:
array([[[0., 0.], [0., 1.]], [[1., 0.], [1., 1.]]])
这里np.stack(i, axis=-1)把每个位置的坐标参数(比如n=2时的i,j)堆叠成一个长度为n的向量,fromfunction就会生成shape=(n,)*n + (n,)的数组,正好符合需求。
方法2:用meshgrid生成坐标网格(更直观)
如果不想用fromfunction,可以直接生成各维度的坐标网格,再堆叠到最后一维:
import numpy as np def coords(n): # 生成n个0到n-1的数组,用meshgrid生成坐标网格(indexing='ij'保证索引顺序正确) grids = np.meshgrid(*[np.arange(n)]*n, indexing='ij') # 把所有网格堆叠到最后一维,得到每个位置的坐标向量 return np.stack(grids, axis=-1)
这种方法逻辑更直白,indexing='ij'是关键——它保证第一维对应第一个坐标、第二维对应第二个坐标,和你示例中的输出顺序一致。
内容的提问来源于stack exchange,提问作者Isaac Feldman
相关产品推荐
相关产品推荐

