對于 D 維問題,我試圖生成ndarray具有特定稀疏模式的 2d 。
我一直在試圖弄清楚如何使用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.
注意:只要所有行都存在,行排序實際上并不重要。
uj5u.com熱心網友回復:
情人眼里出西施。有許多用于生成值的工具;將它們放入所需的布局只是基本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]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/334220.html
