-1

私は次の形式のnumpy配列を持っています:

['viola.jpg' '0.81' '1.0693461723' '100']
['viola.jpg' '0.44' '1.31469086921' '18']
['viola.jpg' '0.8' '3.92096084523' '73']
['vlasta.jpg' '0.88' '1.36559123399' '110']
['vlasta.jpg' '0.88' '1.88126493001' '45']
['vlasta.jpg' '0.76' '1.0510328514' '88']

列0のすべての新しい識別子について、列1と2の値を平均したいと思います。上記から、次のようなものを取得したいと思います。

['viola.jpg' '0.68' '2.14354']
['vlasta.jpg' '0.84' '1.41324']

(最後の列はここでは完全に無関係です。数値の平均、ランダムな数値、または完全に省略されている可能性があります)

私はこれを試みましたが、reduceatは柔軟な型を好まないため失敗します(上記の形式の私の配列は「pics」です)

pics = pics[pics[:,0].argsort()]
print pics
last = pics[:,0]
w = np.where(last[:-1] != last[1:])[0] + 1
w = np.concatenate(([0], w, [len(pics)])) #add 0 and last value
print type(pics), type(w)
means = np.add.reduceat(pics, w[:-1])/np.diff(w)[:,None]
4

2 に答える 2

3

パンダを使用してこれをすばやく行うことができます。

import pandas as pd

data=[['viola.jpg', '0.81', '1.0693461723', '100'],
['viola.jpg', '0.44', '1.31469086921', '18'],
['viola.jpg', '0.8', '3.92096084523', '73'],
['vlasta.jpg', '0.88', '1.36559123399', '110'],
['vlasta.jpg', '0.88', '1.88126493001', '45'],
['vlasta.jpg', '0.76', '1.0510328514', '88']]

df = pd.DataFrame(data, dtype=float)
print df.groupby(0).mean()

結果:

                   1         2          3
0                                        
viola.jpg   0.683333  2.101666  63.666667
vlasta.jpg  0.840000  1.432630  81.000000
于 2013-03-15T22:44:19.683 に答える
1

この文字列のリストをどこから取得したのかわかりませんが、ファイルからの場合は、を使用genfromtxtして、正しいタイプの素晴らしいnumpy配列を取得します。

import numpy as np
from StringIO import StringIO   # to create example file
s = """ viola.jpg  0.81 1.0693461723  100
        viola.jpg  0.44 1.31469086921  18
        viola.jpg  0.8  3.92096084523  73
        vlasta.jpg 0.88 1.36559123399 110
        vlasta.jpg 0.88 1.88126493001  45
        vlasta.jpg 0.76 1.0510328514   88"""
f = StringIO(s) # creates example file with content above
a = np.genfromtxt(f, names = "image, someval, another, someid", dtype=['S12', float, float, int])

さて、aは構造化配列です。field次の名前を使用して列にアクセスできます。

images = np.uniques(a['image']) # gets unique values of the column named 'image'
b = np.empty(len(images), dtype = a.dtype)
for i, image in enumerate(images):
    m = a['image'] == image
    b[i] = (image,) + tuple(a[m][n].mean() for n in a.dtype.names[1:])

:(多分それはそれほど良くはありません...誇張して申し訳ありません。しかし、構造化配列を紹介することは価値があります。それでは、:を見てくださいb

In [3]: b
Out[3]: 
array([('viola.jpg', 0.6833333333333332, 2.101665962246667, 63),
       ('vlasta.jpg', 0.84, 1.4326296718, 81)], 
      dtype=[('image', '|S12'), ('someval', '<f8'), ('another', '<f8'), ('someid', '<i8')])

In [4]: b['image']
Out[4]: 
array(['viola.jpg', 'vlasta.jpg'], 
      dtype='|S12')

In [5]: b['someval']
Out[5]: array([ 0.68333333,  0.84      ])

In [6]: b[1]
Out[6]: ('vlasta.jpg', 0.84, 1.4326296718, 81)

In [7]: b[b['image']=='viola.jpg']
Out[7]: 
array([('viola.jpg', 0.6833333333333332, 2.101665962246667, 63)], 
      dtype=[('image', '|S12'), ('someval', '<f8'), ('another', '<f8'), ('someid', '<i8')])

質問で何から始めているかを考えると、次のようなことができます。

a = np.array([['viola.jpg', '0.81', '1.0693461723', '100'],
              ['viola.jpg', '0.44', '1.3146908692', '18'],
              ['viola.jpg', '0.8', '3.9209608452', '73'],
              ['vlasta.jpg', '0.88', '1.3655912339', '110'],
              ['vlasta.jpg', '0.88', '1.8812649300', '45'],
              ['vlasta.jpg', '0.76', '1.0510328514', '88']])

uniques = np.uniques(a[:,0])
b = np.empty((len(uniques), len(a[0])), dtype = 'S12')

for i,s in enumerate(uniques):
    m = a[:,0] == s
    b[i] = [s] + [a[m,j].astype(float).mean() for j in [1,2]] + [int(a[m,3].astype(float).mean())]
print b
#[['viola.jpg' '0.6833333333' '2.1016659622' '64']
# ['vlasta.jpg' '0.84' '1.4326296717' '81']]

floatより優れたデータ構造を使用すると、、、、およびの内容を追跡するのがはるかに簡単にintなりstringます。証拠については、@HYRYの回答を参照してください。

于 2013-03-15T22:42:55.730 に答える