0

毎回異なる数の列を持つことができる動的多次元配列があります。ユーザーは、N 列のファイルから抽出する列を選択するように求められ、この数に基づいて、多次元配列 'ARRAY_VALUES' が作成されます。

import numpy as num

DIRECTORY = '/Users/user/Desktop/'
DATA_DIC_FILE = "%sOUTPUT_DIC/OUTPUT_DICTIONARIES.txt" %(DIRECTORY)
Choice = str( raw_input( 'Which columns do you want to use (separated by a comma):\t' ) ).split(',')
# Input something like this: 1,2,3,4

String_choice = []
PCA_INDEX     = []
Columns = len(Choice)

PCA_INDEX = {}
# PCA_INDEX is a dictionary that the key is a string whose value is a float number.
PCA_INDEX['any_string'] = float_number # The dictionary has about 50 entries. 

ARRAY_VALUES = [ [] for x in xrange( Columns) ]
""" Creating the N-dimensional array that will contain the data from the file """
""" This list has the form ARRAY_VALUES = [ [], [], [], ... ] for n-repetitions. """

ARRAY_VALUES2 = ARRAY_VALUES

lines = open( DATA_DIC_FILE ).readlines() #Read lines from the file
for i in range( 0, len(ARRAY_VALUES) ):
    ARRAY_VALUES[i] = num.loadtxt( fname = DATA_DIC_FILE, comments= '#', delimiter=',', usecols = [ int( PCA_INDEX[i] ) ], unpack = True )
    """ This saves the lists from the file to the matrix 'ARRAY_VALUES' """

これで、n 列の ARRAY_VALUES = [[], [], ...] の形式の多次元配列ができました。

値のいずれかが「inf」の場合、各列から対応する行を削除したいと考えています。次のコードを使用しようとしましたが、列数に対して動的にする方法がわかりません:

for j in range(0, len(ARRAY_VALUES)):
    for i in range(0, len(ARRAY_VALUES[0])):
        if num.isinf( ARRAY_VALUES[j][i] ) or num.isinf( ARRAY_VALUES[]): # This is where the problem is.
        # if num.isinf( ARRAY_VALUES[0][i] ) or num.isinf(ARRAY_VALUES[1][i] or ... num.isinf(ARRAY_VALUES[last_column][i]: 
            continue
        else:
            ARRAY_VALUES2[j].append( ARRAY_VALUES[j][i] ) #Save the values into ARRAY_VALUES2. 

誰でも私を助けて、この部分を行う方法を教えてもらえますか:

# if num.isinf( ARRAY_VALUES[0][i] ) or num.isinf(ARRAY_VALUES[1][i] or ... num.isinf(ARRAY_VALUES[last_column][i]:

n 列の多次元配列の場合、出力は次のようになります。

ARRAY_VALUES  = [ [8, 2, 3  , inf, 5],
                  [1, 9, inf,  4 , 5],
                  [7, 2, inf, inf, 6] ]

ARRAY_VALUES2 = [ [8, 2, 5],
                  [1, 9, 5],
                  [7, 2, 6] ]

- ありがとう!

4

1 に答える 1

3
>>> a = np.array([[8, 2, 3  , np.inf, 5],[1, 9, np.inf,  4 , 5],[7, 2, np.inf, n
p.inf, 6]])
>>> col_mask = [i for i in range(ncols) if not any(a[:,i] == np.inf)]
>>> print a[:,col_mask]
[[ 8.  2.  5.]
 [ 1.  9.  5.]
 [ 7.  2.  6.]]

まだ使用していない場合は、最初に numpy.array を使用してください。

次に、各列を反復処理し、np.infs をチェックして、許容される列のマスクを作成します

最後に、numpy の列インデックスを使用して、目的の列のみにアクセスします

DSMが指摘しているように、numpyだけでマスクを作成し、リストの理解を避けることができます

col_mask = np.isfinite(a).all(axis=0)
于 2013-05-23T22:40:31.740 に答える