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

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

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

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

Q&A

解決済

2回答

1523閲覧

sparse行列の要素を置換したい。

hoshi1996

総合スコア53

Python

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

0グッド

1クリップ

投稿2020/02/12 04:49

編集2020/02/12 07:18

sparse行列を扱っています。ここでsparse行列の要素をある条件の元に別な値を置換したいです。しかし方法がわからずどのようにすれば良いか教えて欲しいです。

python

1#A is 3×3 Sparse Matrix 2 3print(A) 4#(0, 0) 0.0001 5#(1, 2) 1 6#(2, 1) 0.1 7 8B = Replace(A)# A_ij = 0 if A_ij < 0.01 9 10print(B) 11#(1, 2) 1 12#(2, 1) 0.1 13 14type(A) 15#scipy.sparse.csr.csr_matrix 16

このような置換をしたいです。

また今扱っているsparse行列は大きな規模であるため、sparse行列のまま置換を行いたいです。

追記

python

1def replace_values(sparse_matrix, threshold): 2 import numpy 3 import scipy 4 bool_ = [sparse_matrix.data > threshold][0]# 閾値を超える要素はTrueとなるbool値 5 data = numpy.where(bool_) 6 nonzero = numpy.nonzero(sparse_matrix)# nonzeroの要素番号 7 values = bool_ * sparse_matrix.data# 閾値を超えない要素をゼロにする 8 values = values[~(values == 0)]#ゼロを削除 9 return scipy.sparse.csr_matrix((values,(nonzero[0][data], nonzero[1][data])))

今この関数で望んだような行列を取得することができますが、このコードは冗長であるように感じます。実際、実行時間も長いと感じました。
このコードの修正をお願いしたいです。

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

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

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

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

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

meg_

2020/02/12 05:30

質問でのsparse行列とは何のオブジェクト(クラス)かを質問に追記された方が良いかと思います。
hoshi1996

2020/02/12 05:41

修正しました。
guest

回答2

0

ベストアンサー

これってdata属性の変更でできるんですかね? 

python

1>>> from scipy.sparse import csr_matrix 2>>> m = csr_matrix([[0.001, 0, 0], [0, 0, 1], [0,0.1,0]]) 3>>> m.data # 単に非ゼロの中身が並んでるだけっぽい 4array([0.001, 1. , 0.1 ]) 5>>> type(m.data) # numpy配列らしい 6<class 'numpy.ndarray'> 7>>> m.data[m.data < 0.01] = 0 # 自然な発想で書いてみる 8>>> m.data # ゼロが残る? 9array([0. , 1. , 0.1]) 10>>> print(m) # 残るらしい 11 (0, 0) 0.0 12 (1, 2) 1.0 13 (2, 1) 0.1 14>>> m.eliminate_zeros() # 要らんので詰める 15>>> print(m) # よさそう 16 (1, 2) 1.0 17 (2, 1) 0.1

たぶんいけると思います。ドキュメント化されたpublic属性で書き込み可能なら、いじっても壊れないと期待します。

投稿2020/02/12 11:52

hayataka2049

総合スコア30935

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

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

0

Replacing values in scipy sparse csr matrixを参考にすると、以下のように書けます。

Python

1import numpy as np 2import pandas as pd 3 4from scipy.sparse import csr_matrix, csc_matrix, coo_matrix, lil_matrix 5 6l = [ [0.001, 0, 0], [0, 0, 1], [0,0.1,0]] 7a = csr_matrix(l) 8print(a) 9# (0, 0) 0.001 10# (1, 2) 1.0 11# (2, 1) 0.1 12 13nnz_inds = a.nonzero() 14keep = np.where(a.data >= 0.1)[0] 15b = csr_matrix((a.data[keep], (nnz_inds[0][keep], nnz_inds[1][keep])), shape=a.shape) 16print(b) 17# (1, 2) 1.0 18# (2, 1) 0.1

投稿2020/02/12 07:56

can110

総合スコア38341

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問