Я понятия не имею, где вы получили этот список строк из , но если это из файла, используйте 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']]
Если вы используете более STRU данных cture намного проще отслеживать, что такое float
, int
и string
. Для доказательства см. Ответ @ HYRY.
ли эти списки? И эти фактические строки вместо чисел? Кроме того, ** что вы пробовали до сих пор? ** –
* значения могут быть неверными в моем примере *? Было бы хорошо, если бы вы действительно знали, какие значения ожидать. Также - какие попытки вы предприняли при исследовании решений этого вопроса - что конкретно вы застряли и т. Д.? –
ye olde itertools.groupby и, вероятно, вложенное понимание списка даст вам далеко – YXD