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

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

1765閲覧

特定の文字列からnumpy配列を成形したい

hkenken1997

総合スコア1

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/01/23 15:39

正規表現を使って特定の文字列をnumpy配列に成形したい

スクレイピングで吐き出された文字列が以下のようなものでした。
['1\n2 64.9\n3 1.9\n4 27.0\n5 79.4\n6 9.6\n7 13.4\n8 5.9\n9 34.8']

この文字列から
a[1][2] = 64.9
a[1][3] = 1.9
a[1][4] = 27.0
....
a[1][9] = 34.8
となるような配列を作ろうとしています。 
補足1: a[1]の列は文字列先頭の1に起因してます。
補足2: a[1][i]は \n+'i' からきています
補足3: a[1][i] = x は \n+'i'+' '+ 'x' からきています

試したこと

とりあえず置換したあと、re.search()関数で '\n+[1-9]'で探せば良いと思ったのですが、補足3の 64.9などの小数点を含む場合正規表現でできないと思ったので困っています。他のメソッドを探したほうがいいでしょうか?

該当のソースコード

a = np.arange(9,9)
X = str(X)
i = X[0]
X = X.replace("\n", " ',' ")
X = X.replace("'", "")
X = X.replace("[", "")
X = X.replace("]", "")

python 3.6 numpy reモジュール

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

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

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

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

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

Daregada

2021/01/23 16:04

先頭の1は、別の数字が表れる可能性がありますか? 改行の直後の2~9は、必ず2~9の8個なのか、他の数字が表れたり個数が変わったりする可能性があるのか、どちらでしょうか?
hkenken1997

2021/01/23 16:53

質問ありがとうございます。 >>先頭の1は、別の数字が表れる可能性がありますか? あります。先頭の自然数をiと置いて、a[i][]として使える配列を成形したいです。 >>改行の直後の2~9は、必ず2~9の8個なのか、他の数字が表れたり個数が変わったりする可能性があるのか、どちらでしょうか? 次のループで吐き出されるのが下のようなものがでます。 ['2\n3 111.9\n4 712.0\n5 1141.4\n6 357.1\n7 442.0\n8 286.1\n9 627.3'] ##欲しい配列### a[2][3] = 111.9 a[2][4] = 712.0 .... a[2][9] = 627.3 この場合だと 3~9の7個で個数が変わってしまいます。なので改行の直後の自然数は変数だと思っていただきたいです。 よろしくお願いします。
guest

回答3

0

正規表現より文字列のsplitで処理したほうが簡単な気がします。
まず"\n"でsplitし、得られたそれぞれの文字列を更にスペースでsplitすれば、質問文でいうiとxがすぐに取り出せるのでは。

投稿2021/01/23 17:24

KojiDoi

総合スコア13692

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

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

0

解決済みとなっていますが、参考として投稿します。

python

1import io 2 3import numpy as np 4import pandas as pd 5 6X = ['1\n2 64.9\n3 1.9\n4 27.0\n5 79.4\n6 9.6\n7 13.4\n8 5.9\n9 34.8'] 7i = int(X[0][0]) 8 9df = pd.read_csv(io.StringIO(X[0]), sep=' ') 10a = np.full((i+1, df.index.max()+1), np.nan) 11np.put(a[i], df.index, df) 12 13print(a) 14# [[ nan nan nan nan nan nan nan nan nan nan] 15# [ nan nan 64.9 1.9 27. 79.4 9.6 13.4 5.9 34.8]]

投稿2021/01/25 01:08

kirara0048

総合スコア1399

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

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

0

ベストアンサー

以下のようにやると,一応は条件を満たす配列ができます。

python

1import numpy as np 2 3X = ['1\n2 64.9\n3 1.9\n4 27.0\n5 79.4\n6 9.6\n7 13.4\n8 5.9\n9 34.8'] 4i_s, *rest = X[0].split('\n') 5i = int(i_s) 6pairs = [(int(j_s), float(v_s)) for j_s, v_s in [s.split(' ') for s in rest]] 7max_j = max([j for j, v in pairs]) 8a = np.full((i+1)*(max_j+1), np.NaN).reshape(i+1, max_j+1) 9for j, v in pairs: 10 a[i][j] = v 11 12print(a[1][2]) 13print(a[1][3]) 14print(a[1][4]) 15print(a[1][5]) 16print(a[1][6]) 17print(a[1][7]) 18print(a[1][8]) 19print(a[1][9]) 20print(a)

値を決められないところにはnanを入れてあります。
実行結果は以下です。

python

1>>> import numpy as np 2>>> 3>>> X = ['1\n2 64.9\n3 1.9\n4 27.0\n5 79.4\n6 9.6\n7 13.4\n8 5.9\n9 34.8'] 4>>> i_s, *rest = X[0].split('\n') 5>>> i = int(i_s) 6>>> pairs = [(int(j_s), float(v_s)) for j_s, v_s in [s.split(' ') for s in rest]] 7>>> max_j = max([j for j, v in pairs]) 8>>> a = np.full((i+1)*(max_j+1), np.NaN).reshape(i+1, max_j+1) 9>>> for j, v in pairs: 10... a[i][j] = v 11... 12>>> print(a[1][2]) 1364.9 14>>> print(a[1][3]) 151.9 16>>> print(a[1][4]) 1727.0 18>>> print(a[1][5]) 1979.4 20>>> print(a[1][6]) 219.6 22>>> print(a[1][7]) 2313.4 24>>> print(a[1][8]) 255.9 26>>> print(a[1][9]) 2734.8 28>>> print(a) 29[[ nan nan nan nan nan nan nan nan nan nan] 30 [ nan nan 64.9 1.9 27. 79.4 9.6 13.4 5.9 34.8]]

投稿2021/01/23 17:39

ppaul

総合スコア24670

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

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

hkenken1997

2021/01/23 17:45

迅速な回答ありがとうございます!! スマートな回答で勉強になりました。ベストアンサーにしたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問