使用布尔向量从numpy数组中选择值

时间:2017-11-01 08:48:14

标签: python arrays numpy boolean

我有几个.txt文件包含反应时间(标题:'RT')和正确与不正确的响应(标题:'错误',零正确,标题不正确)。这与本书略有不同:“实验心理学家的Python”。

现在我想使用布尔向量从numpy数组中选择值(例如,只有正确响应的反应时间)。运行python脚本会导致以下错误:

  

选择['correct'] = data ['error'] == 0

     

KeyError:'错误'

以下是我正在处理的代码:

import numpy as np
import glob
import os

# read in file paths
DIR = os.path.dirname(os.path.abspath(__file__))
DATA_DIR = os.path.join(DIR, 'Pilotdata')

# define total number of participants
N = 27
counter = 0

# create empty arrays to store data
rt = np.zeros((2, 2, N))

data_file = glob.glob(os.path.join(DATA_DIR, 's[0-9][0-9]_main_data.txt'))


# read in data
for pnr in range(0, N):
    counter += 1
    RAW = np.loadtxt(data_file[counter], dtype=str, unpack=True)

    data = {}

    for i in range(len(RAW)):
        VARNAME = RAW[i][0]

        try:
            VALUES = RAW[i][1:].astype(float)

        except:
            VALUES = RAW[i][1:]

        data[VARNAME] = VALUES

    select = {}
    select['correct'] = data['error'] == 0
    select['incorrect'] = data['error'] == 1

这似乎是我创建的用于存储值的字典的问题。所以这里是输出的摘录:

"b'error'": array([
"b'0'", "b'0'", "b'0'", "b'0'", "b'0'", "b'0'", "b'0'", "b'1'",
"b'0'", "b'1'", "b'0'", "b'0'", "b'0'", "b'0'", "b'0'", "b'0'",
"b'0'", "b'0'", "b'1'", "b'0'", "b'1'", "b'1'", "b'0'", "b'1'", ...

提前致谢!

编辑:将Python解释器从3更改为2就可以了。有没有办法让代码在Python3中运行?

EDIT2 :使用np.genfromtxt代替np.loadtxt解决了这个问题。

2 个答案:

答案 0 :(得分:0)

我认为问题在于您将数组读取为字节文字(请参阅documentation),因此您的字典不包含字符串"错误"作为一个关键,而不是字节文字' b"错误"'。您可以通过for i in range(len(RAW)): VARNAME = RAW[i][0].decode("utf-8") try: VALUES = RAW[i][1:].decode("utf-8").astype(float) except: VALUES = RAW[i][1:] # I am not even sure what you are trying to # catch here 对其进行解码:

numpy.loadtxt

这可能/应该做的伎俩。显然RAW = np.loadtxt(data_file[counter], dtype=str, unpack=True).astype(str)以字节模式运行,这是Python 2中的默认字符串类型(你使用Python 2吗?如果是,请转到Python 3,它更酷!:D)。有关详细信息,请查看精彩的解释here,其中人们还建议您使用SELECT name, Min(price) FROM phones where name like '%".$nameofproduct."%' 在阅读文件时省去麻烦。

答案 1 :(得分:0)

使用np.genfromtxt代替np.loadtxt解决了问题。