<p><a href="https://github.com/griesemer/dotGo2016">https://github.com/griesemer/dotGo2016</a></p>
<hr/>**评论:**<br/><br/>SteveMcQwark: <pre><p><a href="https://github.com/griesemer/dotGo2016/">https://github.com/griesemer/dotGo2016/</a></p></pre>chewxy: <pre><p>For existing "multi-dim" slices, there's always <a href="https://github.com/chewxy/gorgonia">Gorgonia</a>'s tensor package. </p>
<h1>Slice</h1>
<p>You can slice multidimensionally:</p>
<pre><code>T := NewTensor(WithShape(3,3), WithBacking(RangeFloat64(0,9))
fmt.Printf("T: %+v\n", T)
// T[0]
T0, _ := T.Slice(S(0))
fmt.Printf("T[0]: %+v\n", T0)
//T[:, 0]
T_0, _ := T.Slice(nil, S(0))
fmt.Printf("T[:, 0]: %+v\n", T_0)
// T[0:4:2] - rows 0 to 4, but skip every 2nd row
T012, _ := T.Slice(S(0, 4, 2))
fmt.Printf("T[0:4;2]: %+v\n", T012)
// T[:, 1:3]
T_13, _ := T.Slice(nil, S(1, 3))
fmt.Printf("T[:, 1:3]: %+v\n", T_13)
</code></pre>
<p>Will yield these:</p>
<pre><code>T: Matrix (5, 5) [5 1]
⎡ 0 1 2 3 4⎤
⎢ 5 6 7 8 9⎥
⎢10 11 12 13 14⎥
⎢15 16 17 18 19⎥
⎣20 21 22 23 24⎦
T[0]: Vector (5) [1]
[0 1 2 3 4]
T[:, 0]: Vector (5) [5]
[ 0 5 10 15 20]
T[0:4:2]: Matrix (2, 5) [10 1]
⎡ 0 1 2 3 4⎤
⎣10 11 12 13 14⎦
T[:, 1:3]: Matrix (5, 2) [5 1]
⎡ 1 2⎤
⎢ 6 7⎥
⎢11 12⎥
⎢16 17⎥
⎣21 22⎦
</code></pre>
<h1>Transpose</h1>
<p>You can transpose! The <code>.T()</code> method doesn't move the underlying data. The underlying data is moved only when <code>.Transpose()</code> is called AFTER a <code>.T()</code> is called. This results in a zero-op transposition. Fun fact - the <code>.Transpose()</code> method also doesn't allocate a new array - it's an in-place transpose. I'm working on a version that is based on a rubiks cubes' permutation that allocates even less!</p>
<p>Given a 3-Tensor (oh yeah, it goes beyond 2D tables):</p>
<pre><code>T = NewTensor(WithShape(2, 3, 4), WithBacking(RangeFloat64(0, 24)))
fmt.Printf("T: %+v\n", T)
T.T() // vanilla transpose
fmt.Printf("T.T(): %+v\n", T)
T.UT()
T.T(2, 0, 1)
fmt.Printf("T.T(2,0,1): %+v\n", T)
</code></pre>
<p>This is the result:</p>
<pre><code>T: 3-Tensor (2, 3, 4) [12 4 1]
⎡ 0 1 2 3⎤
⎢ 4 5 6 7⎥
⎣ 8 9 10 11⎦
⎡12 13 14 15⎤
⎢16 17 18 19⎥
⎣20 21 22 23⎦
T.T(): 3-Tensor (4, 3, 2) [1 4 12]
⎡ 0 12⎤
⎢ 4 16⎥
⎣ 8 20⎦
⎡ 1 13⎤
⎢ 5 17⎥
⎣ 9 21⎦
⎡ 2 14⎤
⎢ 6 18⎥
⎣10 22⎦
⎡ 3 15⎤
⎢ 7 19⎥
⎣11 23⎦
T.T(2,0,1): 3-Tensor (4, 2, 3) [1 12 4]
⎡ 0 4 8⎤
⎣12 16 20⎦
⎡ 1 5 9⎤
⎣13 17 21⎦
⎡ 2 6 10⎤
⎣14 18 22⎦
⎡ 3 7 11⎤
⎣15 19 23⎦
</code></pre>
<h1>Reshape</h1>
<p>You can reshape!</p>
<pre><code>T = NewTensor(WithShape(2, 3), WithBacking(RangeFloat64(0, 6)))
fmt.Printf("T: %+v\n", T)
T.Reshape(3, 2)
fmt.Printf("T(reshaped): %+v\n", T)
</code></pre>
<p>Yields:</p>
<pre><code>T: Matrix (2, 3) [3 1]
⎡0 1 2⎤
⎣3 4 5⎦
T(reshaped): Matrix (3, 2) [2 1]
⎡0 1⎤
⎢2 3⎥
⎣4 5⎦
</code></pre></pre>f2f: <pre><p>was anyone from here attending? what is this about, indexing multi-dimensional arrays or iterators?</p>
<p>is there a supporting proposal?</p></pre>joetsai: <pre><p>The main point of his talk: Prototypes are a valuable tool to accompany language proposals.</p>
<p>A prototypes should either explore alternative solutions or be a bare-bones implementation of the proposed language feature. Ideally, the prototype is:</p>
<ul>
<li>Easy to build (only few hundred lines of change)</li>
<li>Thus, easy to the throw away too</li>
<li>Provides valuable insight into other approaches to the problem, how effectively the proposal solves a given problem, or unknown pain-points that the proposal introduces</li>
</ul></pre>xargon7: <pre><p>See this issue: <a href="https://github.com/golang/go/issues/6282" rel="nofollow">https://github.com/golang/go/issues/6282</a></p></pre>Kyrra: <pre><p>So you don't have to dig through the comments, here is the design document: <a href="https://github.com/golang/proposal/blob/master/design/6282-table-data.md" rel="nofollow">https://github.com/golang/proposal/blob/master/design/6282-table-data.md</a></p></pre>howeman: <pre><p>Note that there is a very substantial revision to the proposal in progress:</p>
<p><a href="https://go-review.googlesource.com/#/c/25180/" rel="nofollow">https://go-review.googlesource.com/#/c/25180/</a></p></pre>ngrilly: <pre><p>I really like Griesemer's prototype. It demonstrates two things:</p>
<ul>
<li><p>It looks possible to have user-defined operators ([], +, -, *, etc.) without making the language too much complex.</p></li>
<li><p>If this is possible, Go could become a really great alternative to Python/numpy.</p></li>
</ul>
<p>Example (from the repo):</p>
<pre><code>a := NewMatrix(4, 5)
a.Set(
4, 2, 7, 9, 1,
5, 0, 1, 8, 3,
5, 6, 3, 2, 1,
7, 9, 0, 1, 2,
)
b := NewMatrix(5, 3)
b.Set(
3, 4, 5,
0, 3, 1,
3, 2, 1,
8, 2, 6,
2, 7, 1,
)
(a * b).Print()
</code></pre></pre>
Multi-dim slices playground prototype by Robert Griesemer: https://github.com/griesemer/dotGo2016
polaris · · 493 次点击这是一个分享于 的资源,其中的信息可能已经有所发展或是发生改变。
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传