使用布尔向量从numpy数组中选择值
使用布尔向量从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
解决了问题。
原因:
问题的出现是因为在使用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数组中的特定值。
问题的原因是读取的数组被解释为字节文字,因此字典中不包含字符串"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解决了问题(正如我之前提到的,我使用的是一本教材中的示例)。
很高兴能够帮到您 🙂