Как добавить строку в двумерный Ruby 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 ответа

Решение
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 ] ]

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

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

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

  2. вызов n1.vcat n2

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

n1 << n2

Если вы не хотите менять n1, вы можете:

n1.dup << n2
Другие вопросы по тегам