• 締切済み

2次元配列から条件抽出した要素の操作

ある2次元配列から条件に合う要素だけ抜き出し、 抜き出した要素でまた2次元配列を作りたいのですがうまくいきません。 ary=[[3,7,5,6,],[4,7,3,9],[2,5,3,7],[8,1,4,3]] ary.each{|x| if x[1]>3 p x end } というかんじで条件抽出しているのですが、 ここで得た出力をまた [[4,7,3,9],[8,1,4,3]] というような2次元配列にしたいのですがやりかたがわかりません。

  • Ruby
  • 回答数1
  • ありがとう数0

みんなの回答

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

x[1]>3の条件を満たす配列なら y=ary.select{|x| x[1]>3} のような感じで。

関連するQ&A

  • 【MATLAB】任意の多次元配列からの配列の抽出

    ベクトルvから複数の要素を抽出し,新しいベクトルuを生成する方法には,以下のようにインデックスを指定する方法があります. idx = [3 10 15 28]; u = v(idx); この方法を拡張し,以下のようにN次元配列Aのi次元目のインデックスを指定することで複数の配列を抽出し,新しい配列Bを得ようと考えています. idx = [3 10 15 28]; B = A(:,:, ・・・ ,:,idx,:, ・・・ ,:,:); Aの次元Nはi以上の任意の値で,iは予め指定された値である場合, 配列Bを得る方法はございますでしょうか. 現在,私は以下のような方法で計算しておりますが,コマンド「eval」を用いて力技でしのいでいる感じで,最適な方法が他にあるのでは,と考えております. N = length(size(A)); idx = [3 10 15 28]; i = 3; buf = 'A('; for s = 1:N if s == i buf = [buf 'idx']; else buf = [buf ':']; end if s < N buf = [buf ',']; end end buf = [buf ')']; B = eval(buf);

  • 2次元の連想配列を順次読み込みするには?

    PHP初心者です。 元の連想配列($ary1)   Array ( [2004] => Array ( [03] => 03 [02] => 02 ) [2003] => Array ( [12] => 12 ) ) $ary1の値だけを$ary2に抽出する。   $ary2 = array_values($ary1); すると、こんな内容になります。   Array ( [0] => Array ( [03] => 03 [02] => 02 ) [1] => Array ( [12] => 12 ) ) ここまで来ると上位階層は$ary2[0]、[1]で読めそうですが、 下位階層まで考えると$ary2[0][03]、$ary2[0][02]になっています。 これを$ary2[0][0]、$ary2[0][1]という風に順次読み込みたいのですが、 いい方法が見つかりません。 つまり2次元の下位階層も[0]~のインデックスとしたいのです。

    • ベストアンサー
    • PHP
  • Array#eachのブロック中で要素追加

    初歩的な質問で申し訳ありません ary = [Foo.new] ary.each do |i|  if (条件)   ary.push(Foo.new)  end end 上の様にブロックの中である条件でaryに要素が追加されます。 この場合、この追加された要素はeachで漏れなく扱えるのでしょうか? 簡単なプログラムで試した限りではpushされたFooインスタンスについてもeachで取り出せているようなのですが、自信が無いので質問致します。 # coding: windows-31J class Foo attr_accessor :checked attr_reader :val RAND_MAX = 5 def initialize rnd = Random.new @checked = false @val = rnd.rand(RAND_MAX).to_i end end ary = [Foo.new] ary.each do |f| if f.val > 0 ary.push(Foo.new) end f.checked = true end cnt_true = 0 cnt_false = 0 ary.each_index do |idx| print "#{idx} #{ary[idx].checked} #{ary[idx].val}\n" if ary[idx].checked cnt_true += 1 else cnt_false += 1 end end puts "checked true = #{cnt_true}" puts "checked false = #{cnt_false}" よろしくお願いします。

    • ベストアンサー
    • Ruby
  • 任意の要素数の二次元配列を渡したい

    関数で、各次元の要素を問わず、二次元配列を受け取りたいのですが、下記の方法では失敗しました (要素にアクセスすると落ちる) void func(void *p){ int **v=(int **)p } void func(int p[][3]) 上記のような、指定された数だけを受け取る方法をとるしかないのでしょうか ご存知の方が居ましたら教えてください

  • 2次元配列の配列

    VisualBasic.NETでプログラムを作っているのですが、2次元配列の配列で行き詰って困っています。 配列1~3を別に定義して、その2次元配列を配列Xという配列にひとまとめにしたいのですが、エラーが出てしまいます。 エラー内容は「配列初期化子の次元が少なすぎます」で、場所は配列Xの第1要素です。 配列1~3以降もどんどん配列を追加していく予定なので、なるべく以下の方法で書いていきたいのですが、解決法はないでしょうか? また、他にいい方法があればご教授ください。 ソースです。 ---------------------------------------- Public 配列1(,) As Integer = _ { _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1} _ } Public 配列2(,) As Integer = _ { _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2} _ } Public 配列3(,) As Integer = _ { _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3} _ } Public 配列X(,)() As Integer = { _ 配列1, _     ←ここにエラーが出る 配列2, _ 配列3 _ } ---------------------------------------- 回答よろしくお願いします。

  • C#で、引数における一次元と二次元配列の取り扱い

    C#について質問させていただきます。 以下のようにすればそれぞれ一次元配列と二次元配列を格納出来ますが 同時に一つの引数に収めることは無理なのでしょうか?    public static void Join(string[] Ary_str){ 本文 }    public static void Join(string[ , ] Ary_str){ 本文 } そのために、例えば以下のようにしたとします。    public static void Join(object Ary_obj){ 本文 } こうすれば一次元でも二次元でも格納出来ますが 格納された値が何次元配列なのか確認するために    Ary_obj.Rank としてもエラーになってしまいます。 (1)Objectに格納した値が何次元配列なのか確認する方法か (2)一次元でも二次元でも格納できる引数の指定方法 をご存じの方、ぜひお教え願います。><

  • 3次元配列から2次元配列に

    3次元配列のデータを2次元配列に移すにはどのように したらよいのでしょうか.とりあえず下記のように考えてみましたが. data3[500][500][4000]; //3次元配列 data2[500][500]; //2次元配列 for(y=0; y<500; y++) for(x=0; x<500; x++){ for(z=0; z<4000; z++){ data2[y][x] = data3[y][x][z]; } } } これでいいのでしょうか?

  • 二次元配列における要素数のはじき出し

    普通、配列の要素数を出すとき $num = @list; で良いですよね? ですが、二次元配列で、 $num = @list[1]; って形にするとエラーになります。 どうすればいいのでしょうか?

    • ベストアンサー
    • Perl
  • 動的配列が存在(要素が有る)か否かを判定できますか?

    VBAで、「For ループが初期化されていません」エラーが発生します。 動的配列が要素0の時に発生するようです。 動的配列の要素が生成された場合だけ、Forループしたいのですが、 どうやって判定すればよいのでしょうか? ------------------------------- Dim 配列() As Integer Dim i As Integer i = 0 If (i < 0) Then ' 本当は真になったり偽になったり ReDim 配列(0 To i) 配列(i) = a + b i = i + 1 End If '' if ★★★ then '' 配列が有るか確認 For Each c In 配列 MsgBox c Next '' end if -------------------------------

  • 引数で指定された配列の要素数の取得

    どうもこんにちは。 C言語でプログラムを作成しています。 ある関数に配列を渡すことを考えていますが、渡した配列の要素数を取得する方法は何かありますか? 標準の関数を見ても、配列の先頭アドレスのポインタとともに、配列の要素数を渡しているものばかりで、配列のポインタを渡しているものは見かけません。 要素数があらかじめわかっていれば、それを引数の型に指定できますが、呼び出されるまで不明な場合はうまくいきません。 配列の要素数も引数として一緒に渡す必要がありますか? [作ってみたサンプル] #include <stdio.h> #include <stdlib.h> #include <string.h> // func1 と func2 をまとめられないだろうか。。。 void func1(int (*p)[10]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } void func2(int (*p)[5]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } int main(int argc, char *argv[]) { ________int ary1[10] = { 2, 4, 6, 8, 0, 1, 3, 5, 7, 9 }; ________int ary2[5] = { 3, 6, 9, 12, 15 }; ________func1(&ary1); ________func2(&ary2); ________return 0; }

専門家に質問してみよう