在给定尺寸N
的情况下,创建包含N维立方体顶点坐标(以坐标原点为中心)的numpy数组的有效方法。
例如,对于N=1
,它应返回np.array([[1],[-1]])
对于N=2
,它应返回np.array([[1,1],[1,-1],[-1,1],[-1,-1]])
对于N=3
:np.array([[1,1,1],[1,1,-1],[1,-1,1],[1,-1,-1],[-1,1,1],[-1,1,-1],[-1,-1,1],[-1,-1,-1]])
答案 0 :(得分:2)
您可以使用product
中的itertools
from itertools import product
def vertices(N):
return list(product((1, -1), repeat=N))
print(vertices(1))
# [(1,), (-1,)]
print(vertices(2))
# [(1, 1), (1, -1), (-1, 1), (-1, -1)]
print(vertices(3))
# [(1, 1, 1), (1, 1, -1), (1, -1, 1), (1, -1, -1), (-1, 1, 1), (-1, 1, -1), (-1, -1, 1), (-1, -1, -1)]
答案 1 :(得分:2)
这里是一个纯粹的numpy实现,涉及meshgrid和stack。这有点作弊-欢迎大家提出改进意见。
pts = np.stack(([-1,1],)*N,0)
vertices = (np.array(np.meshgrid(*pts)).T).reshape(2**N,N)
vertices
N=3
返回
array([[-1, -1, -1],
[-1, 1, -1],
[ 1, -1, -1],
[ 1, 1, -1],
[-1, -1, 1],
[-1, 1, 1],
[ 1, -1, 1],
[ 1, 1, 1]])
N=1
返回
array([[-1],
[ 1]])
答案 2 :(得分:2)
这是另一种方法:2*((np.arange(2**N)[:,None] & (1 << np.arange(N))) > 0) - 1
In [25]: N = 1
In [26]: 2*((np.arange(2**N)[:,None] & (1 << np.arange(N))) > 0) - 1
Out[26]:
array([[-1],
[ 1]])
In [27]: N = 2
In [28]: 2*((np.arange(2**N)[:,None] & (1 << np.arange(N))) > 0) - 1
Out[28]:
array([[-1, -1],
[ 1, -1],
[-1, 1],
[ 1, 1]])
In [29]: N = 3
In [30]: 2*((np.arange(2**N)[:,None] & (1 << np.arange(N))) > 0) - 1
Out[30]:
array([[-1, -1, -1],
[ 1, -1, -1],
[-1, 1, -1],
[ 1, 1, -1],
[-1, -1, 1],
[ 1, -1, 1],
[-1, 1, 1],
[ 1, 1, 1]])
它的作用:
数字广播用于矢量化操作。