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

9 浏览
0 Comments

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

我有几个包含反应时间(标题为'RT')和正确与错误响应(标题为'error',正确为0,错误为1)的.txt文件。这与《Python for Experimental Psychologists》一书中稍有不同。现在我想使用布尔向量从numpy数组中选择值(例如,仅选择正确响应的反应时间)。运行Python脚本会导致以下错误:

select['correct'] = data['error'] == 0

KeyError: 'error'

以下是我目前在使用的代码:

import numpy as np
import glob
import os
# 读取文件路径
DIR = os.path.dirname(os.path.abspath(__file__))
DATA_DIR = os.path.join(DIR, 'Pilotdata')
# 定义参与者总数
N = 27
counter = 0
# 创建空数组来存储数据
rt = np.zeros((2, 2, N))
data_file = glob.glob(os.path.join(DATA_DIR, 's[0-9][0-9]_main_data.txt'))
# 读取数据
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中运行?

编辑2:使用np.genfromtxt而不是np.loadtxt解决了问题。

0
0 Comments

原因:

问题的出现是因为在使用np.loadtxt函数时,出现了一些问题。

解决方法:

通过使用np.genfromtxt函数来解决了这个问题。

文章:

在使用numpy数组时,有时我们需要使用布尔向量来选择数组中的特定值。然而,在使用np.loadtxt函数时,可能会出现一些问题。幸运的是,我们可以通过使用np.genfromtxt函数来解决这个问题。

np.loadtxt函数是一个用于从文本文件中加载数据的函数。它可以将文本文件中的数据加载到numpy数组中。然而,有时在使用np.loadtxt函数时,可能会遇到一些问题,导致无法正确选择数组中的特定值。

为了解决这个问题,我们可以使用np.genfromtxt函数。与np.loadtxt函数类似,np.genfromtxt函数也可以从文本文件中加载数据到numpy数组中。然而,np.genfromtxt函数提供了更多的选项和功能,可以更好地处理一些特殊情况。

通过使用np.genfromtxt函数代替np.loadtxt函数,我们可以解决在使用布尔向量选择numpy数组中的特定值时可能遇到的问题。这个函数提供了更灵活和强大的功能,可以满足我们的需求。

在使用布尔向量选择numpy数组中的特定值时,有时可能会遇到问题。通过使用np.genfromtxt函数代替np.loadtxt函数,我们可以解决这个问题。np.genfromtxt函数提供了更多的选项和功能,可以更好地处理一些特殊情况。因此,我们可以放心地使用np.genfromtxt函数来选择numpy数组中的特定值。

0
0 Comments

问题的原因是读取的数组被解释为字节文字,因此字典中不包含字符串"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:]
        # 我甚至不确定您在这里要捕获什么

这应该可以解决问题。显然,numpy.loadtxt在字节模式下操作,这是Python 2中的默认字符串类型(您使用的是Python 2吗?如果是,请转到Python 3,它更酷!:D)。有关更多信息,请参见这里的详细解释,人们还建议在读取文件时可以通过RAW = np.loadtxt(data_file[counter], dtype=str, unpack=True).astype(str)来省去麻烦。

谢谢您的建议。我的问题确实源于不同的Python版本。不幸的是,您的更改导致了不同的错误(AttributeError: 'numpy.str_' object has no attribute 'decode')。将解释器从Python 3更改为Python 2解决了问题(正如我之前提到的,我使用的是一本教材中的示例)。

很高兴能够帮到您 🙂

0