質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

8953閲覧

pythonでnumpyの配列のようなデータを分割したい

miyamoto0105

総合スコア216

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2016/07/03 11:28

編集2016/07/04 22:39

import numpy as np

下記のようなデータを

[[ 0. 0.] [ 0. 1.]]

全体の型
<class 'numpy.ndarray'>
個別の数字の型
<class 'numpy.int64'>

[ 0. 0.]と[ 0. 1.]に分割をしたいです。

vsplitなど試みましたがエラーになります。

aaa = np.ones((3, 4))
print(aaa)
print(np.vsplit(aaa, 2))

のように出力をしているので
[[ 0. 0.]
[ 0. 1.]]
のようにカンマでデータが区切られていないのが問題かと思いますが、
このようなデータの場合分割する一般的な方法はありますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Gazelle

2016/07/03 14:05

もう少し、具体的にどのようなデータかをお聞かせ願えないでしょうか? 質問にあるような下記のデータは、ファイルか何かから読み取った値でしょうか?直接データをコード上に記述するとシンタックスエラーがでます。 [[ 0. 0.] [ 0. 1.]] numpyを引き合いに出していますので、これは行列の値なのでしょうか? といった具合にデータがどのように得られるものか分かりませんので、Stringなのか、数値の2次元配列なのか、もう少し具体的に説明をお願いします。
Gazelle

2016/07/03 14:10

改行が効かないため、見にくい文章になっていました。それを修正しました。
coco_bauer

2016/07/04 02:56

split()で"[[ 0. 0.]"と"[ 0. 1.]]"、2つの文字列に分ける。そして、regexpsで必要な部分を取り出して、配列を生成する。というような事が必要ではないでしょうか?
miyamoto0105

2016/07/04 22:39

大変失礼いたしました。型はintのようです。
guest

回答2

0

ベストアンサー

lightsonさんの回答と、追記文を読んでようやく質問の意図と、つまづいているところ理解しました。

##誤解の解消

まずは、lightsonさんの仰るとおり、printで単純に出力しているようですが、入力して値を結果を確認してみてください。

python

1import numpy as np 2my_array = np.ones((3, 4)) 3print(repr(my_array))

結果は次のようになります。

array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]])

このように、numpyのarrayとして出力することが可能です。
iPythonなどのインタプリタでやる場合は

>>> import numpy as np >>> my_array = np.ones((3, 4)) >>> my_array

と入力すれば同じ結果が得られます。つまり、ここで言いたいことは、値を確認するときに print で出力しているため、変数に格納された値を誤解しているのではないでしょうか、ということです。

ゆえに、出力された値が「カンマ区切りだから・・・うんぬん」ということは気にしなくても良いでしょう。

##本題の解決方法

誤解の指摘はこの辺にしておいて、現在達成されたいことは追記分を踏まえると

numpyで生成した2次元配列を分割したい

ということだとして話を勧めます。

まずは、当所の質問にあるデータを準備します。ただ、説明の便宜上、値を変えておきます。

import numpy as np my_array = np.array([[0, 1], [2, 3]])

ここで用意したmy_arrayから[0, 1][2, 3]を切り分けたい、とのことでしたので、幾つかのパターンで紹介したいと思います。

パターン1: 非常にシンプルに分ける場合

2x2の行列のみしか扱わないのであれば、次のようにやるのが最もシンプルでしょう。

my_array[0] # array([0, 1]) を返す my_array[1] # array([2, 3]) を返す

パターン2: numpy.vsplitで均等に分割する

result_array = np.vsplit(my_array, 2) # [array([[0, 1]]), array([[2, 3]])] result_array[0] # array([0, 1]) を返す result_array[1] # array([2, 3]) を返す

解説を付け加えておくと、m行ある行列(ここではdataとすると)をn等分する場合、次のようになります。

python

1np.data(data, n) # dataはm行ある行列

この時、mnで割り切れる必要があります。

lightsonさんの回答のコメントにあるような以下の様なコードではエラーが出ます。

my_array = np.ones((3, 4)) # 3行4列の行列 np.vsplit(my_array,2) # 3行の行列を2等分できないためエラー

このとき、エラーメッセージとして

ValueError: array split does not result in an equal division

が出力されたのではないでしょうか。

パターン3: vsplitで不均等に分割する

例えば、10行の行列を 2, 3, 6 というように分割したいときは次のようにします。

my_array = np.ones((10, 4)) # 10行4列の行列 np.vsplit(my_array, [2, 5]) # 長いので結果は略

vsplitの第二引数をlistまたは``tuple```で指定すると、第二引数の値の位置で分割をしてくれます。つまり、次のような違いがあります。

my_array = np.ones((10, 4)) np.vsplit(my_array, 2) # 第二引数が int なので、my_arrayを2分割 np.vsplit(my_array, [2]) # 第二引数が list なので、my_arrayを0-2, 2-10で分割 np.vsplit(my_array, (2,)) # 第二引数がtuple なので、my_arrayを0-2, 2-10で分割

といった具合になります。行だけでなく列も自由に調整したいといことでしたら、numpy.splitを使用すると良いでしょう。

見返してみると長々と書いてしまいました。とりあえず、七夕が近いので、この記事がどこかの誰かのためになりますように^^

参考

投稿2016/07/05 02:02

Gazelle

総合スコア136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

かなり想像が入りますが、print(my_array) した時に表示される内容をarrayそのものと誤解されているのではないでしょうか。

python

1>>> my_lst=[[0.,0.],[0.,1.]] 2>>> my_lst 3[[0.0, 0.0], [0.0, 1.0]] 4 5>>> my_array=np.array(my_lst) 6>>> my_array 7array([[ 0., 0.], 8 [ 0., 1.]]) 9 10>>> print(my_array) 11[[ 0. 0.] 12 [ 0. 1.]] 13 14>>> np.vsplit(my_array,2) 15[array([[ 0., 0.]]), array([[ 0., 1.]])]

投稿2016/07/04 12:27

lightson

総合スコア553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyamoto0105

2016/07/04 22:42

my_array = np.ones((3, 4)) print("1:",my_array) my_array = np.array(my_array) print("2:",my_array) # print(np.vsplit(my_array,2)) こちらで出した値をみると [[ 1. 1. 1. 1.] [ 1. 1. 1. 1.] [ 1. 1. 1. 1.]] のようにカンマで区切られていないのでvsplitでエラーになっております。 同じ現象になりませんでしょうか??
lightson

2016/07/05 03:24

Gazelleさんの回答にありますように、エラーになる理由は3行を2つに分けることができないからです。4行なら2つに分割できるのでエラーは出ません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問