Guest User

Untitled

a guest
Feb 19th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.77 KB | None | 0 0
  1. #Reuben Grinberg
  2. #reuben dot grinberg at aya dot yale dot e d u
  3. class Array
  4. def jj() return "[#{self.join(",")}]"; end
  5.  
  6. def replaceWith(a, b)
  7. Array.new(self).replaceWith!(a,b)
  8. end
  9.  
  10. def replaceWith!(a, b)
  11. # map! { |obj| obj == a ? b : obj }
  12.  
  13. each_with_index { |obj, i| self[i] = b if obj == a }
  14. self
  15. end
  16.  
  17. def copy() return Array.new(self); end
  18.  
  19. def slidingPairs(&block)
  20. self[0,length-1].zip(cdr).map(&block)
  21. end
  22.  
  23. def transpose!() return replace(transpose); end
  24.  
  25. def diff!(other) return replace(diff(other)) end
  26.  
  27. def diff(other)
  28. zip(other).map{|x,y| (x-y) }
  29. end
  30.  
  31. def diffabs(other)
  32. zip(other).map{|x,y| (x-y).abs }
  33. end
  34.  
  35. def sum(&block)
  36. map(&block).inject { |sum, obj| sum+obj }
  37. end
  38.  
  39. def product(&block)
  40. map(&block).inject {|prod,obj| prod*obj }
  41. end
  42.  
  43. def mean(&block)
  44. sum(&block)/length.to_f
  45. end
  46.  
  47. def to_hash
  48. inject({}) {|h, k| h[k[0]] = k[1]; h }
  49. end
  50.  
  51. def mean_stdev
  52. m = mean
  53. return [m, Math.sqrt(mean { |v| (v - m) ** 2 } )]
  54. end
  55.  
  56. def stdev() return mean_stdev[1]; end
  57.  
  58. # the whole list except the first element
  59. def cdr() return self[1...length]; end
  60.  
  61. def set(inds, value)
  62. inds.each{ |i| self[i] = value }
  63. self
  64. end
  65.  
  66. def matchingIndices(b)
  67. indices.select { |i| self[i] == b[i] }
  68. end
  69.  
  70. def location
  71. # return a Vector object of me and don't copy me but use a reference.
  72. Vector.elements(self, false)
  73. end
  74.  
  75. def mode() return mode_count[0]; end
  76.  
  77. def mode_count
  78. h = inject(Hash.new(0)) { |hash, v| hash[v]+=1; hash }
  79. mx = h.values.max
  80. [h.invert[mx], mx]
  81. end
  82.  
  83. def count(v) return grep(v).length; end
  84.  
  85. #same as flatten except it doesn't work recursively - just flattens once
  86. def flatten_once
  87. inject([]) { |vals, a| Array === a ? vals += a : vals << a }
  88. end
  89.  
  90. def indices
  91. (0...length).to_a
  92. end
  93.  
  94. def flatten_once!
  95. replace(flatten_once)
  96. end
  97.  
  98. # removes runs of the same element
  99. def squeeze
  100. inject([]) { |arr, v| arr << v if v!=arr.last || arr.empty?; arr }
  101. end
  102.  
  103. def bag_by
  104. bags = Hash.new {|h,k| h[k] = [] }
  105. each { |v| bags[yield(v)] << v }
  106. bags
  107. end
  108.  
  109. def uniform
  110. uniq.length == 1
  111. end
  112.  
  113. def recursiveGet
  114. return map { |e| e.respond_to?(:recursiveGet) ? e.recursiveGet() : e }.flatten
  115. end
  116. end
Add Comment
Please, Sign In to add comment