创建具有N维立方体顶点坐标的numpy数组

时间:2018-09-07 20:31:51

标签: python numpy multidimensional-array

在给定尺寸N的情况下,创建包含N维立方体顶点坐标(以坐标原点为中心)的numpy数组的有效方法。

例如,对于N=1,它应返回np.array([[1],[-1]])

对于N=2,它应返回np.array([[1,1],[1,-1],[-1,1],[-1,-1]])

对于N=3np.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]])

3 个答案:

答案 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]])

它的作用:

  • 创建一个从0到2 ** N-1的整数数组。
  • 将整数转换为二进制数(例如3变为[1,1,0])。
  • 将二进制数组乘以2并减去1,即可将0和1转换为-1和1。

数字广播用于矢量化操作。