无法加载 numpy 数组,它们在 python 中显示 pickle 数据错误
Trouble loading numpy array where they show pickle data error in python
我可以使用 Numpy
成功保存和加载小型数组。现在我使用 np.save('array.npy')
保存下面的数组
[0, 100, 0, 5, 10, 15, 20, 25, 30, 25, 20, 15, 10, 5, 0]
当我尝试使用 np.load('array.npy')
加载时,它显示以下错误:
raise ValueError("Cannot load file containing pickled data "
ValueError: Cannot load file containing pickled data when allow_pickle=False
如果我尝试通过添加 allow_pickle=True
来解决它,那么它会显示以下错误:
raise IOError(
OSError: Failed to interpret file 'array.npy' as a pickle
真是处境艰难。请指教! :(
我指的代码如下:
def recv():
import socket
import time
import numpy as np
TCP_IP = "0.0.0.0"
BUFFER_SIZE = 20 # Normally 1024, but we want fast response
# receiving CAN frame payload
TCP_PORT = 5003
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((TCP_IP,TCP_PORT))
s.listen(1)
conn,addr = s.accept()
while 1:
data1 = conn.recv(BUFFER_SIZE)
if not data1: break
datalist = list(data1)
print("CAN payload: %s" % datalist)
conn.send(data1) # echo
conn.close()
time.sleep(2)
# ------------------------------------------------------------
# assembling CAN frame
from can import Message
can_msg = Message(is_extended_id=bool(datalist[0]),arbitration_id=datalist[1],data=datalist[2:])
# printing all received payloads
print("CAN frame: ",can_msg)
print("Vehicle speed: ",datalist[2:])
# Saving all received payloads
np.save('array.npy',datalist[2:]) # save
def EPS_process():
# EPS process for Right turn, high speed
import numpy as np
print("Starting EPS process")
speed_array = np.load('array.npy') # load
那个数组应该不会给你带来任何问题:
In [1]: arr = np.array([0, 100, 0, 5, 10, 15, 20, 25, 30, 25, 20, 15, 10, 5, 0])
In [2]: arr
Out[2]:
array([ 0, 100, 0, 5, 10, 15, 20, 25, 30, 25, 20, 15, 10,
5, 0])
In [3]: np.save('test.npy',arr)
In [4]: np.load('test.npy')
Out[4]:
array([ 0, 100, 0, 5, 10, 15, 20, 25, 30, 25, 20, 15, 10,
5, 0])
好的,我想分享解决问题的方法。所以基本上 @hpaulj 建议对于多个进程,读取可能会在保存完成之前开始。所以我在 speed_array = np.load('array.npy')
之前添加了 3 秒的延迟
这为 NumPy
数组提供了足够的时间来保存,然后我才能再次读取。否则,它将读取先前保存的数组并因此读取 pickle 错误。
我可以使用 Numpy
成功保存和加载小型数组。现在我使用 np.save('array.npy')
[0, 100, 0, 5, 10, 15, 20, 25, 30, 25, 20, 15, 10, 5, 0]
当我尝试使用 np.load('array.npy')
加载时,它显示以下错误:
raise ValueError("Cannot load file containing pickled data "
ValueError: Cannot load file containing pickled data when allow_pickle=False
如果我尝试通过添加 allow_pickle=True
来解决它,那么它会显示以下错误:
raise IOError(
OSError: Failed to interpret file 'array.npy' as a pickle
真是处境艰难。请指教! :(
我指的代码如下:
def recv():
import socket
import time
import numpy as np
TCP_IP = "0.0.0.0"
BUFFER_SIZE = 20 # Normally 1024, but we want fast response
# receiving CAN frame payload
TCP_PORT = 5003
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((TCP_IP,TCP_PORT))
s.listen(1)
conn,addr = s.accept()
while 1:
data1 = conn.recv(BUFFER_SIZE)
if not data1: break
datalist = list(data1)
print("CAN payload: %s" % datalist)
conn.send(data1) # echo
conn.close()
time.sleep(2)
# ------------------------------------------------------------
# assembling CAN frame
from can import Message
can_msg = Message(is_extended_id=bool(datalist[0]),arbitration_id=datalist[1],data=datalist[2:])
# printing all received payloads
print("CAN frame: ",can_msg)
print("Vehicle speed: ",datalist[2:])
# Saving all received payloads
np.save('array.npy',datalist[2:]) # save
def EPS_process():
# EPS process for Right turn, high speed
import numpy as np
print("Starting EPS process")
speed_array = np.load('array.npy') # load
那个数组应该不会给你带来任何问题:
In [1]: arr = np.array([0, 100, 0, 5, 10, 15, 20, 25, 30, 25, 20, 15, 10, 5, 0])
In [2]: arr
Out[2]:
array([ 0, 100, 0, 5, 10, 15, 20, 25, 30, 25, 20, 15, 10,
5, 0])
In [3]: np.save('test.npy',arr)
In [4]: np.load('test.npy')
Out[4]:
array([ 0, 100, 0, 5, 10, 15, 20, 25, 30, 25, 20, 15, 10,
5, 0])
好的,我想分享解决问题的方法。所以基本上 @hpaulj 建议对于多个进程,读取可能会在保存完成之前开始。所以我在 speed_array = np.load('array.npy')
这为 NumPy
数组提供了足够的时间来保存,然后我才能再次读取。否则,它将读取先前保存的数组并因此读取 pickle 错误。