

numpy.arrayを用いた配列の中から、取得したい値を検索し、printで表示させるようにしたいです。  
しかし

[code]

     index = np.where(data[powering] == 2.35)
     IndexError: arrays used as indices must be of integer (or boolean) type
    
[/code]

と言ったエラーがでてしまいます。今配列の中身は、小数も含まれているので、エラーに書かれてある、integerにはできない状態です。どのようにすれば、値を取得できるようにできるのでしょうか。  
現在のpythonコードは下記のようになっています。

[code]

    def content(volta, currenting, powering ):
      import numpy as np
      from math import floor
      from math import ceil
    
      a = np.array([volta, currenting, powering])
      support = np.round(a,２)
      data = np.transpose(support)
    
      sample = open("test.txt", "w")
      sample.write(str(data))
      sample.close()
    
      index = np.where(data[powering] == 2.35)
      if index == 2.35:
        vout = 2.9/(2.9 + data[currenting])
        print (str(vout))
        sleep(10)
      else:
        nextvalue = np.round(a,1)
        datatwo = np.transpose(nextvalue)
    
[/code]


CC BY-SA 3.0
2016-08-22T07:34:11.527
28427
2016-09-16T19:54:27.383
13491
question
python numpy
numpy.arrayの配列から値を取得したい


配列の要素が持つ「値」は浮動小数点で表される実数でも良いですが、配列の要素を指定する「添字」は整数じゃないといけないと思います。
エラーメッセージは`data[0]`とか、`data[26946,3953964]`とかは解釈できるけど、`data[1.594306850]`とか、`powering=[2.3353,
2.3554,
2.295090]`のときに`data[powring]`とか言われても、何のことか分かりません、と言っているんだと思います。まあ、そうですよね。

やりたいことを察するに、  
currenting=[0.2398, 0.30234, 0.15930, 0.398111, 0.221598]  
powering =[2.2901, 2.37831, 2.34988, 2.352199, 2.125985]  
というリストがあったら、poweringの要素の値が四捨五入して2.35になっている、添字2と3を拾ってくるべし、そして、currenting[2]とcurrenting[3]を使って、voutを計算すべし、ということかと思いました。

そうであれば、あえてnumpy.whereを使って書くなら、例えばこんな風に書けばいいのではないでしょうか。

[code]

    #!/usr/bin/python
    #
    # This script was written by norio 2016-09-16.
    
    def calc_v0(currenting, powering,  p0, eps):
        '''
        This function returns a tupple (idx, v0arr), where `idx` and 
        `v0arr` are numpy arrays of integer and float types, respectively.
        Here `idx` is an array of those integers `j` such  that 
        `p0-eps < powering[j] < p0+eps`, and 
        `v0arr` is an array of those values `2.9/(2.9+currenting[j])`,
        for each `j` in `idx`.
        '''
    
        import numpy as np 
        carr = np.array(currenting)
        parr = np.array(powering)
    
        idx = np.where(np.logical_and(p0-eps<parr, parr<p0+eps))[0] 
        c0arr = carr[idx] 
        v0arr = 2.9/(2.9+c0arr)
        return (idx, v0arr)
    
    
    currenting=[0.2398, 0.30234,  0.15930, 0.398111, 0.221598]
    powering  =[2.2901, 2.37831,  2.34988, 2.352199, 2.125985]
    p0 = 2.350
    eps = 5.0e-3
    (index, vout) = calc_v0(currenting, powering, p0, eps)
    
    print '# index        vout'
    for jj,vv in zip(index, vout):
        print '%5i %20.5e' %(jj, vv)
    
[/code]

標準出力にはこんな感じのデータが表示されると思います。

[code]

    # index        vout
        2          9.47929e-01
        3          8.79291e-01
    
[/code]

またnumpyを使わなくても、こんな風にも書けると思います。

[code]

    #!/usr/bin/python
    #
    # This script was written by norio 2016-09-16.
    
    currenting=[0.2398, 0.30234,  0.15930, 0.398111, 0.221598]
    powering  =[2.2901, 2.37831,  2.34988, 2.352199, 2.125985]
    p0 = 2.350
    eps = 5.0e-3
    
    index=[jj for jj in range(len(powering)) 
           if (p0-eps<powering[jj] and powering[jj]<p0+eps)]
    vout =[2.9/(2.9+currenting[jj]) for jj in index]
    
    print '# index        vout'
    for jj,vv in zip(index, vout):
        print '%5i %20.5e' %(jj, vv)
    
[/code]

もし、添字のリストはとくにいらないなら、こんな感じでもっと簡単に書けると思います。

[code]

    #!/usr/bin/python
    #
    # This script was written by norio 2016-09-16.
    
    currenting=[0.2398, 0.30234,  0.15930, 0.398111, 0.221598]
    powering  =[2.2901, 2.37831,  2.34988, 2.352199, 2.125985]
    p0 = 2.350
    eps = 5.0e-3
    
    vout =[2.9/(2.9+cc) for cc,pp in zip(currenting, powering) 
           if (p0-eps<pp and pp<p0+eps)]
    
    print '# vout'
    for vv in vout:
        print '%20.5e' %(vv)
    
[/code]


CC BY-SA 3.0
2016-09-16T19:54:27.383
28942
2016-09-16T19:54:27.383
18817
28427
answer