对于d维问题,我试图生成具有特定稀疏模式的2dndarray
。
我一直在试图找出如何使用np.meshgrid
等交错向量,但就是无法到达那里。
稀疏矩阵(实际上不需要稀疏,只需要包含0
s和1
s)的形状为(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]])