[英]ValueError: setting an array element with a sequence. on data read from csv
我试图按行从csv加载数据,然后从每行创建2d数组并将其存储在数组中:
正在加载:
with open('data_more.csv', newline='') as csvfile:
data = list(csv.reader(csvfile))
解析:
def getTrainingData():
label_data = []
for i in range( 0 , len(data) - 1):
y = list(data[i][1:41:1])
y = list(map(lambda x: list(map(lambda z: int(z),x)),y))
y = create2Darray(y)
label_data.append(y)
labelY = np.array(label_data,dtype=float)
create2Darray函数:
def create2Darray( arr ):
final_arr = []
index = 0
while( index < len(arr)):
temp = arr[index:index+4:1]
final_arr.append(temp)
index+=4
return final_arr
这是简单的任务,但我一直收到错误提示:
ValueError:设置具有序列的数组元素。
我已经读到它与元素形状不同时的情况有关。 但是,当我打印labelY内所有元素的形状时,它会输出相同的形状。
那是什么引起这个问题呢? 该行出现问题
labelY = np.array(label_data,dtype=float)
我的csv具有格式
number, number, number
行basicly N个相隔“” 例如感谢您的帮助。
让我们从头开始:
您似乎想遍历文件的每一行以创建一个数组。 迭代应该在range(0, len(data))
之上,而不是range(0, len(data) - 1)
:范围的最后一个元素是Exclusive ,所以您当前正在跳过最后一行。 实际上,您可以简单地编写range(len(data))
,或者甚至更像Python一样
for y in data: y = y[1:41]
根据后面的内容,您希望y
的40个元素从第二个元素开始。 在这种情况下, y[1:41]
是正确的(您不需要尾随:1
)。 如果您不想跳过第一个元素,请使用y[0:40]
,或者使用Python更好的y[:40]
。 请记住,索引是从零开始的,而停止索引是排他的 。
y
列表中的每个元素都不是数字。 这是一个字符串,您可以从文件中读取。 通常,您可以使用以下命令将其转换为数字列表
y = [float(x) for x in y]
要么
y = list(map(float, y))
您的代码将为每个元素创建一个嵌套列表,并按数字对其进行拆分。 这真的是您想要的吗? 从其余的问题来看,肯定不是那样。
create2Darray
似乎期望包含4n
数字的列表,并将其分解为大小为n-by-4
的2D列表。 如果您现在想继续使用纯Python,可以使用range
缩短代码:
def create2Darray(arr): return [arr[i:i + 4] for i in range(0, len(arr), 4)]
label_data.append(y)
附加到3D列表中。 当前,由于数字拆分, label_data
是第4维label_data
的4D列表。 这样添加列表是非常低效的。 对于在for
循环主体中包含语句的小型函数,并在列表理解中使用它,您会做得更好。 int
时,为什么要dtype=np.float
,但这是您要找出的。 getTrainingData
添加一个返回值! TL; DR
但是,您真正能做的最简单的事情是在将文件转换为2D numpy数组后进行所有转换。 您的程序可以重写为
with open('data_more.csv', newline='') as file:
reader = csv.reader(file)
data = [float(x) for x in line[1:] for line in reader]
data = np.array(data).reshape(data.shape[0], -1, 4)
从您的链接中复制n粘贴:
In [367]: txt="""frame_video_02_0.jpg,126,37,147,112,100,41,126,116,79,34,96,92,
...: 68,31,77,88,1
...: """
In [368]: txt=txt.splitlines()
In [369]: data =np.genfromtxt(txt, delimiter=',')
data
是浮点数的二维数组:
In [370]: data.shape
Out[370]: (3, 401)
In [371]: data[0,:10]
Out[371]: array([ nan, 126., 37., 147., 112., 100., 41., 126., 116., 79.])
第一列是nan
,因为它是无法制成浮点数的文本。 我可以用data = data[:, 1:]
删除它
我可以分别加载文件名:
In [373]: labels = np.genfromtxt(txt, delimiter=',', usecols=[0],dtype=None,encoding=None)
In [374]: labels
Out[374]:
array(['frame_video_02_0.jpg', 'frame_video_02_50.jpg',
'frame_video_02_100.jpg'], dtype='<U22')
我没有尝试调试您的代码,尽管使用这样的文件,将数字读入Python列表列表并不难。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.