如何用numpy优雅地生成这种稀疏模式?



对于d维问题,我试图生成具有特定稀疏模式的2dndarray

我一直在试图找出如何使用np.meshgrid等交错向量,但就是无法到达那里。

稀疏矩阵(实际上不需要稀疏,只需要包含0s和1s)的形状为(2^D, D),其中D为维数。

当D=2时,矩阵是这样的:

two_d = [
[0, 0],
[1, 0],
[0, 1],
[1, 1],
]

对于D=3,它是这样的:

three_d = [
[0, 0, 0],
[1, 0, 0],
[0, 1, 0],
[1, 1, 0],
[0, 0, 1],
[1, 0, 1],
[0, 1, 1],
[1, 1, 1],
]

这是一个超级明显的稀疏模式,但我正在努力弄清楚如何用numpy优雅地再现它。

注意:行顺序实际上并不重要,只要所有的行都存在。

是否合格取决于旁观者的看法。有许多工具可以生成这些值;将它们放入所需的布局只是基本的numpy操作。

生成这些数组的基本方法是:
In [6]: np.array(list(itertools.product([0,1],repeat=2)))
Out[6]: 
array([[0, 0],
[0, 1],
[1, 0],
[1, 1]])
In [7]: np.array(list(itertools.product([0,1],repeat=3)))
Out[7]: 
array([[0, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 1],
[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1]])

从注释中:

In [16]: np.indices((2,2))
Out[16]: 
array([[[0, 0],
[1, 1]],
[[0, 1],
[0, 1]]])
In [17]: np.indices((2,)*2).T.reshape(-1,2)
Out[17]: 
array([[0, 0],
[1, 0],
[0, 1],
[1, 1]])
In [18]: np.indices((2,)*3).T.reshape(-1,3)
Out[18]: 
array([[0, 0, 0],
[1, 0, 0],
...
In [20]: np.meshgrid(np.arange(2),np.arange(2),indexing='ij')
Out[20]: 
[array([[0, 0],
[1, 1]]),
array([[0, 1],
[0, 1]])]
In [21]: np.transpose(np.meshgrid(np.arange(2),np.arange(2),indexing='ij')).resh
...: ape(-1,2)
Out[21]: 
array([[0, 0],
[1, 0],
[0, 1],
[1, 1]])

"ij"不是必需的;它只是创建一个初始的数组集合,看起来像indices

mgrid也可以使用。和:

np.array(list(np.ndindex(2,2,2)))

另一种方法是逆向工程three_d

In [55]: res = np.zeros((2**3,3),int)

设置第一列的所有其他元素很容易:

In [56]: res[1::2,0]=1
In [57]: res
Out[57]: 
array([[0, 0, 0],
[1, 0, 0],
[0, 0, 0],
[1, 0, 0],
[0, 0, 0],
[1, 0, 0],
[0, 0, 0],
[1, 0, 0]])

在第二个中设置值对比较棘手:

In [58]: res[:,1].reshape(-1,4)[:,2:]=1
In [59]: res
Out[59]: 
array([[0, 0, 0],
[1, 0, 0],
[0, 1, 0],
[1, 1, 0],
[0, 0, 0],
[1, 0, 0],
[0, 1, 0],
[1, 1, 0]])

设置第三个连续块也很简单:

In [60]: res[4:,2]=1
In [61]: res
Out[61]: 
array([[0, 0, 0],
[1, 0, 0],
[0, 1, 0],
[1, 1, 0],
[0, 0, 1],
[1, 0, 1],
[0, 1, 1],
[1, 1, 1]])

最新更新