为了账号安全,请及时绑定邮箱和手机立即绑定

传递给函数的 numpy 数组没有改变

传递给函数的 numpy 数组没有改变

千巷猫影 2023-04-18 15:50:12
我已经尝试了很多来解决这个问题,但不幸的是没能解决它。我想将一个 numpy 数组传递给一个函数并在那里进行更改。def GetDataFromDAQ(self, timestamp, msdata, signalname):    tmptime, tmpdata = self.DAQ.return_data(signalname)    timestamp= np.append(timestamp, tmptime)    msdata = np.append(msdata, tmpdata)这就是函数的调用self.ActiveMSData = MeasurementData()self.GetDataFromDAQ(self.ActiveMSData.RawData["timestamps"], self.ActiveMSData.RawData["data"], "frequency")那是班级的一部分class MeasurementData():def __init__(self):    self.RawData = {}    self.RawData["timestamps"] = np.empty(0)    self.RawData["data"] = np.empty(0) 我用 VS Code 调试它,发现函数中的数组时间戳和 msdata 被填充,但我传递的 Measurementclass 的成员根本没有改变。我在这里错过了什么?
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

函数中的赋值使名称成为函数范围内的变量。


如果GetDataFromDAQ是同一类/实例的方法/函数,您必须将新数组分配给实例属性。


def GetDataFromDAQ(self, timestamp, msdata, signalname):

    tmptime, tmpdata = self.DAQ.return_data(signalname)

    self.RawData["timestamps"] = np.append(timestamp, tmptime)

    self.RawData["data"] = np.append(msdata, tmpdata)

如果您希望函数不那么具体,则必须返回新数据。


def GetDataFromDAQ(self, timestamp, msdata, signalname):

    tmptime, tmpdata = self.DAQ.return_data(signalname)

    t = np.append(timestamp, tmptime)

    d = np.append(msdata, tmpdata)

    return t,d


t = self.ActiveMSData.RawData["timestamps"]

d = self.ActiveMSData.RawData["data"]

t,d = self.GetDataFromDAQ(t,d,"frequency")

self.ActiveMSData.RawData["timestamps"],self.ActiveMSData.RawData["data"] = t,d

您最初尝试的一个并发症是您正在创建一个全新的对象append而不是修改现有对象。如果您真的想尝试使该函数通用,您可以预期时间序列数据可能变成的最大大小,并将数组初始化为该大小,并用一个值填充它们,使您可以确定在何处插入下一个数据系列. 然后在函数中您可以分配给数组的一部分而无需创建新对象。像这样的东西。


import numpy as np

rawdata = {'timestamps':np.full(10,np.nan),

           'data':np.full(10,np.nan)}


def f(t,d):

    nextt = np.argmax(np.isnan(t))

    nextd = np.argmax(np.isnan(d))

    newdata = [1,2,3]

    newtimestamps = [8,7,6]

    endt = nextt + len(newtimestamps)

    endd = nextd + len(newdata)

    t[nextt:endt] = newtimestamps

    d[nextd:endd] = newdata

    return None

    

##print(rawdata)

t = rawdata['timestamps']

d = rawdata['data']

f(t,d)

f(t,d)

print(rawdata)

查看完整回答
反对 回复 2023-04-18
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信