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

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

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

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

Python

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

Q&A

解決済

3回答

1210閲覧

文字列と数列の混在したデータのnumpy処理

Shu0101

総合スコア14

NumPy

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

Python

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

0グッド

0クリップ

投稿2019/05/01 03:11

#問題点
こんにちは。
文字列と数列が並んだ以下のInputを読み込み、数列のみnumpyで取り扱うため配列化したいと考えています(コード参照)。
まず、DATA1をnp.loadtxtで読み込むと、1行目をスキップできるので、正常に処理されます。
一方、4行目にも文字列を含むDATA2では、この行でエラーが出ます。
つきましては、適切に文字列行のみを飛ばして数列をnumpy処理する方法をご教示頂けませんでしょうか。
なお、Inputファイルの形式は変更できません。
また、pandasを使うことは可能です。
よろしくお願いします。

#コード

※以下のdata=はいずれかのみ使用

import numpy as np
data = np.loadtxt("DATA.TXT", skiprows=1)
for line in data:
swof = np.array(line)
swof[1] = swof[0]**2
print (swof)

------DATA1.TXT------------
A B C D
1.0000 1.0000 2.0000 3.0000
4.0000 5.0000 6.0000 7.0000

------DATA2.TXT------------
A B C D
1.0000 1.0000 2.0000 3.0000
4.0000 5.0000 6.0000 7.0000
E F G H
8.0000 8.0000 9.0000 10.0000
11.0000 12.0000 13.0000 14.0000

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

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

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

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

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

guest

回答3

0

ベストアンサー

今、環境がなくて試せていないのですが、
ファイルから文字列の行を取り除いてから、np.genfromtxtで読み込めば良いと思います。

python

1import re 2import numpy as np 3 4with open("DATA.TXT") as file: 5 data = np.genfromtxt((line for line in file if not re.search("[A-Za-z]", line)))

投稿2019/05/01 05:48

bsdfan

総合スコア4560

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

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

Shu0101

2019/05/01 13:12

ありがとうございます。Pandasを使わないスマートな方法でしたので、ベストアンサーとさせて頂きました!
guest

0

pandasを使うと以下のようにして文字の行を除去できます。

Python

1import numpy as np 2import pandas as pd 3 4df = pd.read_csv('DATA.TXT', delimiter='\s',engine='python') 5 6# 数値に変換。文字列はNaNに。 7for c in df.columns: 8 df[c] = pd.to_numeric(df[c],errors='coerce') 9 10# NaN行を除去 11df = df.dropna(axis=0, how='any') 12 13# ndarrayへ変換 14a = df.values 15print(a) 16""" 17[[ 1. 1. 2. 3.] 18 [ 4. 5. 6. 7.] 19 [ 8. 8. 9. 10.] 20 [ 11. 12. 13. 14.]] 21"""

投稿2019/05/01 05:40

can110

総合スコア38262

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

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

Shu0101

2019/05/01 13:13

ありがとうございます。pandasを使う方法として大変勉強になりました!
guest

0

こんにちは
いろいろなやり方がありそうですが、自分ならこうするかなというのを回答します。

まず、ご質問に挙げられている python のコードで、np.loadtxt しているところの skiprows を無くして、以下のようにします。(スクリプトファイル名を仮にtest.pyとします。)

test.py

python

1import numpy as np 2 3data = np.loadtxt("DATA.TXT") 4 5for line in data: 6 swof = np.array(line) 7 swof[1] = swof[0]**2 8 print(swof)

 

上記のようにすると、 DATA.TXTはアルファベットの行を含まないものになっていなければなりませんが、それは awkコマンド を使って、以下のようにすれば出来ます。(以下で $ はシェルプロンプトです)

shell

1awk '/^[0-9]/{print}' DATA1.txt > DATA.TXT

以下は、上記を使ってDATA1.TXTおよびDATA2.TXTのそれぞれから DATA.TXTを作って確認したところです。

$ cat DATA1.TXT

A B C D
1.0000 1.0000 2.0000 3.0000
4.0000 5.0000 6.0000 7.0000

$ awk '/^[0-9]/{print}' DATA1.txt > DATA.TXT

$ cat DATA.TXT
1.0000 1.0000 2.0000 3.0000
4.0000 5.0000 6.0000 7.0000

$ cat DATA2.txt

A B C D
1.0000 1.0000 2.0000 3.0000
4.0000 5.0000 6.0000 7.0000
E F G H
8.0000 8.0000 9.0000 10.0000
11.0000 12.0000 13.0000 14.0000

$ awk '/^[0-9]/{print}' DATA2.txt > DATA.TXT

$ cat DATA.TXT
1.0000 1.0000 2.0000 3.0000
4.0000 5.0000 6.0000 7.0000
8.0000 8.0000 9.0000 10.0000
11.0000 12.0000 13.0000 14.0000

$

上記を使えば、アルファベットの行を除去した DATA.TXT を先の test.py に処理させるには、以下のようにすれば出来ます。(DATA.TXTは中間生成物なので、消してます)

$ awk '/^[0-9]/{print}' DATA1.txt > DATA.TXT; python test.py; rm -f DATA.TXT

[1. 1. 2. 3.]
[ 4. 16. 6. 7.]

$ awk '/^[0-9]/{print}' DATA2.txt > DATA.TXT; python test.py; rm -f DATA.TXT

[1. 1. 2. 3.]
[ 4. 16. 6. 7.]
[ 8. 64. 9. 10.]
[ 11. 121. 13. 14.]
$

以上、参考になれば幸いです。

投稿2019/05/01 03:59

編集2019/05/01 04:42
jun68ykt

総合スコア9058

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

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

Shu0101

2019/05/01 13:16

ありがとうございます。シェルスクリプトはあまり詳しくないので、勉強してみます汗
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問