【问题标题】:Use Boolean vectors to select values from numpy arrays使用布尔向量从 numpy 数组中选择值
【发布时间】:2017-11-01 08:48:13
【问题描述】:

我有几个 .txt 文件,其中包含反应时间(标题:“RT”)以及正确与不正确的响应(标题:“错误”,零表示正确,一表示不正确)。这与《实验心理学家的 Python》一书略有不同。

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

选择['正确'] = 数据['错误'] == 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 解决了这个问题。

【问题讨论】:

    标签: python arrays numpy boolean


    【解决方案1】:

    我认为问题在于您将数组读取为字节文字(请参阅documentation),因此您的字典不包含字符串“error”作为键,而是包含字节文字'b“error”'。您可以通过b"error".decode("utf-8") 对其进行解码:

    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 在字节模式下运行,这是 Python 2 中的默认字符串类型(您使用 Python 2 吗?如果是,请移至 Python 3,它更酷!:D)。有关更多信息,请查看精彩的解释 here,其中人们还建议您使用 RAW = np.loadtxt(data_file[counter], dtype=str, unpack=True).astype(str) 可以省去阅读文件时的麻烦。

    【讨论】:

    • 感谢您的建议。我的问题确实源于不同的 Python 版本。可悲的是,您的更改导致了不同的错误(AttributeError:'numpy.str_'对象没有属性'decode')。将解释器从 Python3 更改为 Python2 就可以解决问题(如前所述,我使用了一个教科书示例)。
    • 很高兴能帮上忙 :)
    【解决方案2】:

    使用np.genfromtxt 而不是np.loadtxt 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2019-09-02
      • 1970-01-01
      • 2020-10-23
      • 2013-11-27
      • 2018-11-06
      • 2014-01-09
      • 2014-10-20
      • 1970-01-01
      • 2016-08-30
      相关资源
      最近更新 更多