【问题标题】:How can I take the outer product of string vectors in J?如何在 J 中获取字符串向量的外积?
【发布时间】:2021-02-15 01:46:13
【问题描述】:

我正在尝试在 APL 中复制外部产品符号:

∘.,⍨ 'x1' 'y1' 'z1' 'x2' 'y2' 'z2' 'x3' 'y3' 'z3'

产生

 x1x1 x1y1 x1z1 x1x2 x1y2 x1z2 x1x3 x1y3 x1z3 
 y1x1 y1y1 y1z1 y1x2 y1y2 y1z2 y1x3 y1y3 y1z3 
 z1x1 z1y1 z1z1 z1x2 z1y2 z1z2 z1x3 z1y3 z1z3 
 x2x1 x2y1 x2z1 x2x2 x2y2 x2z2 x2x3 x2y3 x2z3 
 y2x1 y2y1 y2z1 y2x2 y2y2 y2z2 y2x3 y2y3 y2z3 
 z2x1 z2y1 z2z1 z2x2 z2y2 z2z2 z2x3 z2y3 z2z3 
 x3x1 x3y1 x3z1 x3x2 x3y2 x3z2 x3x3 x3y3 x3z3 
 y3x1 y3y1 y3z1 y3x2 y3y2 y3z2 y3x3 y3y3 y3z3 
 z3x1 z3y1 z3z1 z3x2 z3y2 z3z2 z3x3 z3y3 z3z3 

但我不知道如何在 J 中做类似的事情。我发现这个 Cartesian product in J 帖子我认为足够相似,但我似乎无法将它转换为来自数字数组。

改编 Dan Bron 的答案并将其应用于更简单的示例

6 6 $ , > { 2 # < 'abc'

给予

aaabac
babbbc
cacbcc
aaabac
babbbc
cacbcc

这几乎是我想要的,但我不知道如何概括它以使用 2 个字母(或更多)字符串而不是类似方式的单个字符串。我也不知道如何用 APL 输出对之间的空格来格式化这些结果,所以它也可能不是正确的路径。

同样,我尝试从该线程中改编 Michael Berry 的答案以获得

9 36 $ ,,"1/ ~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'

给了

x1x1x1y1x1z1x1x2x1y2x1z2x1x3x1y3x1z3
y1x1y1y1y1z1y1x2y1y2y1z2y1x3y1y3y1z3
z1x1z1y1z1z1z1x2z1y2z1z2z1x3z1y3z1z3
x2x1x2y1x2z1x2x2x2y2x2z2x2x3x2y3x2z3
y2x1y2y1y2z1y2x2y2y2y2z2y2x3y2y3y2z3
z2x1z2y1z2z1z2x2z2y2z2z2z2x3z2y3z2z3
x3x1x3y1x3z1x3x2x3y2x3z2x3x3x3y3x3z3
y3x1y3y1y3z1y3x2y3y2y3z2y3x3y3y3y3z3
z3x1z3y1z3z1z3x2z3y2z3z2z3x3z3y3z3z3

再一次,这几乎是我想要的,这个处理了多个字符,但它们之间仍然没有空格,并且命令与 APL 版本的简单性越来越远。

我可以使用 ravel items 更清晰地获得相同的结果

,. ,"1/ ~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'

我一直在阅读 J 入门并探索在字典中看起来相关的部分,但我仍然很新,所以如果这是一个愚蠢的问题,我深表歉意。我觉得秩联合运算符应该能够在这里帮助我,但是我很难按照入门书中的解释进行操作。我使用": 尝试将字符串格式化为带有尾随空格,但我也无法弄清楚。这在 APL 中如此简单的事实也让我觉得我在 J 中做错了事,会遇到这么多麻烦。

在阅读了更多的入门书后,我得到了一些看起来像我想要的东西

,. 9 1 $ ' ' ,."2 ,"1/~ [ ;._2 'x1 y1 z1 x2 y2 z2 x3 y3 z3 '

但这仍然比 APL 版本复杂得多,所以我仍然希望有一种真正优雅简洁的方法来做到这一点。

【问题讨论】:

    标签: j


    【解决方案1】:

    我认为我可以添加到您已经指出的内容中的唯一内容是,要将字符串分隔成您需要装箱的组件。

       <@,"1/~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'
    +----+----+----+----+----+----+----+----+----+
    |x1x1|x1y1|x1z1|x1x2|x1y2|x1z2|x1x3|x1y3|x1z3|
    +----+----+----+----+----+----+----+----+----+
    |y1x1|y1y1|y1z1|y1x2|y1y2|y1z2|y1x3|y1y3|y1z3|
    +----+----+----+----+----+----+----+----+----+
    |z1x1|z1y1|z1z1|z1x2|z1y2|z1z2|z1x3|z1y3|z1z3|
    +----+----+----+----+----+----+----+----+----+
    |x2x1|x2y1|x2z1|x2x2|x2y2|x2z2|x2x3|x2y3|x2z3|
    +----+----+----+----+----+----+----+----+----+
    |y2x1|y2y1|y2z1|y2x2|y2y2|y2z2|y2x3|y2y3|y2z3|
    +----+----+----+----+----+----+----+----+----+
    |z2x1|z2y1|z2z1|z2x2|z2y2|z2z2|z2x3|z2y3|z2z3|
    +----+----+----+----+----+----+----+----+----+
    |x3x1|x3y1|x3z1|x3x2|x3y2|x3z2|x3x3|x3y3|x3z3|
    +----+----+----+----+----+----+----+----+----+
    |y3x1|y3y1|y3z1|y3x2|y3y2|y3z2|y3x3|y3y3|y3z3|
    +----+----+----+----+----+----+----+----+----+
    |z3x1|z3y1|z3z1|z3x2|z3y2|z3z2|z3x3|z3y3|z3z3|
    +----+----+----+----+----+----+----+----+----+
    

    如果您想摆脱这些框并插入空格,那么您实际上不会单独拥有字符项,您将获得带有空格的长字符串作为结果的一部分。

    这是一个很好的问题,因为它要求你理解 J 中的字符串是向量的事实。我想从技术上讲,您正在寻找的是 9 9 4 形状,但它看起来不像您期望的那样。

       ,"1/~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'
    x1x1
    x1y1
    x1z1
    x1x2
    x1y2
    x1z2
    x1x3
    x1y3
    x1z3
    
    y1x1
    y1y1
    y1z1
    y1x2
    y1y2
    y1z2
    y1x3
    y1y3
    y1z3
    
    z1x1
    z1y1
    z1z1
    z1x2
    z1y2
    z1z2
    z1x3
    z1y3
    z1z3
    
    x2x1
    x2y1
    x2z1
    x2x2
    x2y2
    x2z2
    x2x3
    x2y3
    x2z3
    
    y2x1
    y2y1
    y2z1
    y2x2
    y2y2
    y2z2
    y2x3
    y2y3
    y2z3
    
    z2x1
    z2y1
    z2z1
    z2x2
    z2y2
    z2z2
    z2x3
    z2y3
    z2z3
    
    x3x1
    x3y1
    x3z1
    x3x2
    x3y2
    x3z2
    x3x3
    x3y3
    x3z3
    
    y3x1
    y3y1
    y3z1
    y3x2
    y3y2
    y3z2
    y3x3
    y3y3
    y3z3
    
    z3x1
    z3y1
    z3z1
    z3x2
    z3y2
    z3z2
    z3x3
    z3y3
    z3z3
       $ ,"1/~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'
    9 9 4
    
    您也可以将这些框转换为符号,这可能更接近您想要的,尽管它们确实将反引号指示符作为其表示的一部分。
     s:@<@,"1/~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'
    `x1x1 `x1y1 `x1z1 `x1x2 `x1y2 `x1z2 `x1x3 `x1y3 `x1z3
    `y1x1 `y1y1 `y1z1 `y1x2 `y1y2 `y1z2 `y1x3 `y1y3 `y1z3
    `z1x1 `z1y1 `z1z1 `z1x2 `z1y2 `z1z2 `z1x3 `z1y3 `z1z3
    `x2x1 `x2y1 `x2z1 `x2x2 `x2y2 `x2z2 `x2x3 `x2y3 `x2z3
    `y2x1 `y2y1 `y2z1 `y2x2 `y2y2 `y2z2 `y2x3 `y2y3 `y2z3
    `z2x1 `z2y1 `z2z1 `z2x2 `z2y2 `z2z2 `z2x3 `z2y3 `z2z3
    `x3x1 `x3y1 `x3z1 `x3x2 `x3y2 `x3z2 `x3x3 `x3y3 `x3z3
    `y3x1 `y3y1 `y3z1 `y3x2 `y3y2 `y3z2 `y3x3 `y3y3 `y3z3
    `z3x1 `z3y1 `z3z1 `z3x2 `z3y2 `z3z2 `z3x3 `z3y3 `z3z3
    

    【讨论】:

    • 啊,盒装的表示至少比我拥有的 ravel items 版本要好得多,而且不像将空格缝合回去那么复杂。如果有更接近 APL 的东西,我会暂缓接受,但是看到 &lt;@ 这样的东西已经非常有帮助了。谢谢!
    • 归结为您是只想按照 APL 显示结果,还是要使用结果。正如@bob 建议的那样,因为 J 对待表示字符串的方式与 APL 不同,所以外部产品的默认显示看起来不同。如果您只想复制显示,您可以这样做。 ' '&amp;joinstring"1 &lt;@,"1/~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'
    • 我刚刚添加了一个将加框表示转换为符号的选项,这至少看起来更接近 APL 结果。
    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2014-01-21
    相关资源
    最近更新 更多