Как добавить строку в двумерный Ruby NArray? - PullRequest
1 голос
/ 15 марта 2012

Я хочу добавить строку в двумерный массив NArray. Способ, описанный в NArray 0-7 Tutorial , довольно сложный - и мне интересно, есть ли более простой способ.

Итак, если у меня есть два NArrays:

n1 = [[ 0,  1,  2,  3],
      [ 4,  5,  6,  7],
      [ 8,  9, 10, 11],
      [12, 13, 14, 15]]

n2 = [16, 17, 18, 19]

Я хотел бы добавить n1 и n2, чтобы получить n3:

n3 = [[ 0,  1,  2,  3],
      [ 4,  5,  6,  7],
      [ 8,  9, 10, 11],
      [12, 13, 14, 15],
      [16, 17, 18, 19]]

Как это можно сделать?

Ответы [ 4 ]

2 голосов
/ 16 марта 2012
require "narray"

class NArray
  def concat(other)
    shp = self.shape
    shp[1] += 1
    a = NArray.new(self.typecode,*shp)
    a[true,0...-1] = self
    a[true,-1] = other
    return a
  end
end

n1 = NArray[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11],
            [12, 13, 14, 15]]

n2 = NArray[16, 17, 18, 19]

p n1.concat(n2)
# => NArray.int(4,5):
#    [ [ 0, 1, 2, 3 ],
#      [ 4, 5, 6, 7 ],
#      [ 8, 9, 10, 11 ],
#      [ 12, 13, 14, 15 ],
#      [ 16, 17, 18, 19 ] ]
1 голос
/ 15 марта 2012

Вы также можете использовать n3 = n1 + [n2], это работает с примером, который вы привели.

1 голос
/ 15 марта 2012

Если посмотреть на то, в каком учебнике вы упомянули, то на самом деле все очень просто:

  1. Скопируйте определение класса "Объединение разных массивов" в свой код (или создайте новый .rb, требующий NArray с этим определением; и потребуйте новый файл в свой код вместо NArray)

  2. вызов n1.vcat n2

0 голосов
/ 15 марта 2012

Вы можете использовать оператор <<.Он изменит n1. </p>

n1 << n2

Если вы не хотите, чтобы n1 был изменен, вы можете:

...