【问题标题】:Dividing character vector into segments将字符向量划分为段
【发布时间】:2014-07-22 05:55:45
【问题描述】:

我有以下向量VecACGTTGCA 并想将其划分为一个嵌套向量,其中在第 i 个位置将有一个长度为 4 的 Vec 子段,从 Vec 的第 i 个位置开始。

例如,Vec[(⍳¯3+⍴Vec)∘.+¯1+⍳4] 返回:

ACGT
CGTT
GTTG
TTGC
TGCA

但是上面输出的问题是它是一个字符矩阵,而我想得到以下输出:

┌──────────────────────────┐
│┌────┬────┬────┬────┬────┐│
││ACGT│CGTT│GTTG│TTGC│TGCA││
│└────┴────┴────┴────┴────┘│
└──────────────────────────┘

对于以下字符串: vec←'Hy, only testing segmenting vec into pieces of 4' 我正在寻找的正确结果是:

┌→────────────────────────────────────────┐
│ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐             │
│ │Hy, │ │y, o│ │, on│ │ onl│ (and so on) │
│ └────┘ └────┘ └────┘ └────┘             │
└∊────────────────────────────────────────┘

另外,有没有办法将此类向量转换为单个向量,其中后续行将包含 4 个字符?

示例:对于 foobartesting 字符向量,结果将是:

foob
ooba
obar
bart
arte
rtes
test
esti
stin
ting

【问题讨论】:

    标签: vector apl dyalog


    【解决方案1】:

    回到你原来的问题:你只需要添加一个前导的“分割”(↓)来将你的矩阵结果变成你正在(正在)寻找的向量的向量。请注意,虽然它可能不那么优雅,但基于生成索引矩阵的“经典”解决方案可能更有效,因为大多数 APL 解释器优化的案例列表中并不包含特定的窗口缩减。

    在英特尔酷睿 i5 @ 1.60Ghz 上运行的 Dyalog APL v14.0/64 中:

    x←'foobartesting'

    (4 ,/ x) 执行时间约为 9.3 微秒

    (↓4 {⍵[(0,⍳-⍺-⍴⍵)∘.+⍳⍺]} x) 时钟在 2.3 左右

    随着向量长度的增加,效率差距也越来越大;当您达到长度为 10,000 的参数时,窗口化减少几乎慢了 10 倍(7 对 0.7 毫秒)。

    在 Dyalog APL 中,1 字节和 2 字节整数类型的可用性增强了“经典”方法的效率;如果您使用其他 APL 口译员,您的里程可能会有所不同。

    【讨论】:

      【解决方案2】:

      这是在 GNU APL 中测试的,但我认为这在 Dyalog 中应该没有什么不同。我的解决方案就这么简单:

            4 ,/ 'foobartesting'
       foob ooba obar bart arte rtes test esti stin ting
      

      【讨论】:

      • 谢谢,我知道一定有更简单(更快)的解决方案。
      • 顺便说一句,有没有办法做类似的事情,即创建一个看起来像这样的单个向量:foob\nooba\nobar\n(...)\nting(编辑我的问题以显示我的要求)?
      • 只需使用单子⊃。这将获取一个数组列表并从中创建一个二维数组。即,只需执行 ⊃ 4 ,/ 'foobartesting' 即可。我不知道我是否应该更新答案以涵盖此问题?
      • 如果你能更新你的答案,那就太好了,因为我无法让它发挥作用。
      • 我记得看到 Dyalog 混淆了 ⊃ 和 ↑ 符号(或类似的符号)。它也受到⎕ML设置的影响。我不使用 Dyalog,所以无法测试自己,但请尝试将⊃ 替换为 ↑ 或 ↓。
      【解决方案3】:

      我不确定我是否正确理解了您的描述。 但我的理解是,你有一个向量:

      vec←'Hy, only testing segmenting vec into pieces of 4'
      

      哦,此外,我们需要为此执行分配迁移级别;-)

      ⎕ml←3
      

      理解问题后修改答案;-):

            display 4{⍺↑¨(0,⍳(⍴⍵)-⍺)↓¨⊂⍵}'ACGTTGCA'
      ┌→───────────────────────────────────┐
      │ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐ │
      │ │ACGT│ │CGTT│ │GTTG│ │TTGC│ │TGCA│ │
      │ └────┘ └────┘ └────┘ └────┘ └────┘ │
      └∊───────────────────────────────────┘
      

      【讨论】:

      • 谢谢,但这并不是我想要的。我已经更新了我的问题,以说明我想如何处理您的示例。
      • 好的,tx 以获取更多详细信息 - 我更新了我的回复 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 2021-11-30
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多