2013-11-13 2 views
3

Может кто-нибудь узнать, что не так с кодом ниже?Получение индексов в numpy

import numpy as np 
data = np.recfromcsv("data.txt", delimiter=" ", names=['name', 'types', 'value']) 
indices = np.where((data.name == 'david') * data.types.startswith('height')) 
mean_value = np.mean(data.value[indices]) 

Я хочу, чтобы вычислить среднее значение веса и роста для Давида и знака следующим образом:

david>> mean(weight_2005 and weight_2012), mean (height_2005 and height_2012) 
mark>> mean(weight_2005 and weight_2012), mean (height_2005 and height_2012) 

Из файла (data.txt) текст:

david weight_2005 50 
david weight_2012 60 
david height_2005 150 
david height_2012 160 
mark weight_2005 90 
mark weight_2012 85 
mark height_2005 160 
mark height_2012 170 

Я использую python 3.2 и numpy 1.8

Приведенный выше код обеспечивает ошибку типа следующим образом:

TypeError: startswith first arg must be bytes or a tuple of bytes, not numpy.str_ 
+1

Код наверх работает для меня. 'mean_value' -' 155.0', с python 2, numpy 1.7 – askewchan

+0

@askewchan, которым вы пользуетесь verson python и numpy? – 2964502

+1

Я могу воспроизвести сообщение об ошибке в python 3.3 и 'numpy' 1.9.0.dev-8a2728c. Работает ли 'data.types.astype (str) .startswith (" height ")'? (Если это так, мы должны, вероятно, выяснить, что подходит для идиомы для декодирования.) – DSM

ответ

1

С Python3.2 и NumPy 1,7, эта линия работает

indices = np.where((data.name == b'david') * data.types.startswith(b'height')) 

data дисплеи:

rec.array([(b'david', b'weight_2005', 50),...], 
     dtype=[('name', 'S5'), ('types', 'S11'), ('value', '<i4')]) 

type(data.name[0]) является <class 'bytes'>.

b'height' также работает в Python2.7.


другой вариант, чтобы преобразовать все данные в Unicode (Python 3 строки)

dtype=[('name','U5'), ('types', 'U11'), ('value', '<i4')] 
dataU=data.astype(dtype=dtype) 
indices = np.where((dataU.name == 'david') * dataU.types.startswith('height')) 

или

data = np.recfromtxt('data.txt', delimiter=" ", 
    names=['name', 'types', 'value'], dtype=dtype) 

Похоже recfromcsv не принимает dtype, но recfromtxt делает ,

+0

Существует сообщение об ошибке и исправление для того, что 'recfromcsv' не принимает' dtype': https://github.com/numpy/numpy/issues/311 – hpaulj

Смежные вопросы