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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

6391閲覧

Python:二次元配列の列から任意の文字と一致する要素の削除

shohei_2018

総合スコア7

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2018/06/06 20:16

前提・実現したいこと

二週間ほど前からpythonの勉強を独学でしています。
現在、投票制度のプログラムをつくろうとしています。二次元配列の任意の値と一致する列の要素を削除しようとしているところでエラーがでてしまいます。
今回は二次元配列の一番目の列から最小投票数の立候補者'2'(最小が二名以上いる場合はだれでもいい)を削除し、削除した列はつめる。そして、また一番目の列をカウントする(まだ繰りかえしはできていない)を行いたいと考えています。

発生している問題・エラーメッセージ

[['A' '3' '2' '1' '4' '5'] ['B' '4' '3' '2' '1' '5'] ['C' '5' '3' '4' '2' '1'] ['D' '4' '3' '2' '1' '5'] ['E' '3' '2' '1' '4' '5'] ['F' '1' '3' '4' '5' '2'] ['G' '1' '3' '4' '2' '5'] ['H' '4' '3' '2' '5' '1'] ['I' '2' '3' '4' '1' '5'] ['J' '2' '1' '4' '3' '5'] ['K' '5' '3' '2' '1' '4']] 立候補者数は5人です。 過半数:3 もう一度ソートしなおします。 2 最小投票数の立候補者:2 Traceback (most recent call last): File "election.py", line 62, in <module> election_sort(data2) File "election.py", line 53, in election_sort data4.remove(min_cand) AttributeError: 'numpy.ndarray' object has no attribute 'remove'

該当のソースコード

def file_open(file): import sys data = [] try: f = open(file, 'r', encoding='utf-8') except Exception:#ファイルの拡張子の違い、ファイル名の間違い print('OPEN ERROR>>ファイルが見つからないorファイル拡張子の違い:', str(file)) sys.exit(1) for line in f: line = line.strip() #前後空白削除 line = line.replace('\n','') #末尾の\nの削除 line = line.split(",") #分割 data.append(line) f.close() return data def election_sort(data2): import numpy as np import collections import math #import os.remove as rm data4 = np.array(data2) print(data4) line1_array = data4[0,:]#一行目を抽出する file1_array = data4[:,1]#投票者の第一位を抽出する #print(line1_array) #print(file1_array) cand = len(line1_array) -1#立候補者 print('立候補者数は{0}人です。'.format(cand)) half_cand = math.ceil(cand/2)#過半数 print('過半数:{0}'.format(half_cand)) count_array = collections.Counter(file1_array)#立候補者の投票数をカウント top = count_array.most_common()[0][1]#最も多い立候補者 #who_top = count_array.most_common()[0] #print(who_top) low = count_array.most_common()[-1][1]#最も少ない立候補者 #print(count_array) #print(type(count_array)) #print(issubclass(type(count_array), dict)) #print(top) #print(low) if top > half_cand:#topが過半数を超えているか比較する print('当選者は{0}です!'.format(top)) return True else: print('もう一度ソートしなおします。') min_cand = count_array.most_common()[-1][0] print(min_cand) print('最小投票数の立候補者:{0}'.format(min_cand)) //以下の2行を加えたらエラーが発生しました。 data4.remove(min_cand) print(data4) if __name__ == '__main__': data2 = file_open('test2.csv')#csvを引数にfiel_opne関数を呼び出す #print(data2) election_sort(data2)

試したこと

...
else:
print('もう一度ソートしなおします。')
min_cand = count_array.most_common()[-1][0]
del_cand = [min_cand]//文字の配列にしてみた、1文字しかないけど
print(min_cand)
print('最小投票数の立候補者:{0}'.format(min_cand))

data4.remove(del_cand) print(data4)

補足情報(FW/ツールのバージョンなど)

windows 10
python 3.6.5
numpy 1.14.3+mkl

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

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

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

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

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

guest

回答2

0

たぶん、やりたいことはこういう事なのかと。

def file_open(file): import sys data = [] try: f = open(file, 'r', encoding='utf-8') except Exception:#ファイルの拡張子の違い、ファイル名の間違い print('OPEN ERROR>>ファイルが見つからないorファイル拡張子の違い:', str(file)) sys.exit(1) for line in f: line = line.strip() #前後空白削除 line = line.replace('\n','') #末尾の\nの削除 line = line.split(",") #分割 data.append(line) f.close() return data def election_sort(data2): import numpy as np import collections import math #import os.remove as rm while True: data4 = np.array(data2) print(data4) line1_array = data4[0,:]#一行目を抽出する file1_array = data4[:,1]#投票者の第一位を抽出する #print(line1_array) #print(file1_array) cand = len(line1_array) -1#立候補者 print('立候補者数は{0}人です。'.format(cand)) half_cand = math.ceil(cand/2)#過半数 print('過半数:{0}'.format(half_cand)) count_array = collections.Counter(file1_array)#立候補者の投票数をカウント top = count_array.most_common()[0][1]#最も多い立候補者 #who_top = count_array.most_common()[0] #print(who_top) low = count_array.most_common()[-1][1]#最も少ない立候補者 #print(count_array) #print(type(count_array)) #print(issubclass(type(count_array), dict)) #print(top) #print(low) if top > half_cand:#topが過半数を超えているか比較する print('当選者は{0}です!'.format(top)) return True print('もう一度ソートしなおします。') min_cand = count_array.most_common()[-1][0] print(min_cand) print('最小投票数の立候補者:{0}'.format(min_cand)) # ↓このように変更 for row in data2: row.remove(min_cand) if __name__ == '__main__': data2 = file_open('test2.csv')#csvを引数にfiel_opne関数を呼び出す #print(data2) election_sort(data2)

変更した点は2点

  • election_sort関数内に無限ループ (while True:)を追加
  • 削除部を修正

です
削除部に関してですが、numpy配列(data4)にはremove() がありませんので、2次元リスト(data2)から全ての対象の削除をおこなっております。
(全体のループの先頭にて、再度 data2よりdata4が生成されるのでこれでも問題ないと思います。)

投稿2018/06/06 23:44

magichan

総合スコア15898

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

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

shohei_2018

2018/06/07 03:28

ありがとうございます。 ループのところ参考にさせていただきます。
guest

0

ベストアンサー

習いたてというらしいので、解決するための流れを書きます。


File "election.py", line 53, in election_sort data4.remove(min_cand) AttributeError: 'numpy.ndarray' object has no attribute 'remove'

エラーを
読むと、53行目のdata4というオブジェクトに、.removeメソッドがないとのことです。


Google検索で、numpy array remove deleteを調べると以下のようなリンクを見つけることができます。
公式ドキュメントです。

https://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html

引数を3つとって、

  1. 要素を削除したいnumpy.array
  2. 何番目の要素か
  3. どの軸方向か

となっています。


他にも日本語で、
http://keisanbutsuriya.hateblo.jp/entry/2016/12/14/171515
仕様の変更に伴ってうまくいかないことが書かれているケースがあるので注意が必要です。

例がたくさん転がっているので、説明を理解できたか不安がある場合、短いコードを書いて挙動を確認します。

投稿2018/06/06 23:12

mkgrei

総合スコア8560

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

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

shohei_2018

2018/06/07 03:51

コメントありがとうございます。 サイトを参考にもう一度考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問