繁体   English   中英

ValueError:设置具有序列的数组元素。 从csv读取的数据

[英]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个相隔“” 例如感谢您的帮助。

让我们从头开始:

  1. 您似乎想遍历文件的每一行以创建一个数组。 迭代应该在range(0, len(data))之上,而不是range(0, len(data) - 1) :范围的最后一个元素是Exclusive ,所以您当前正在跳过最后一行。 实际上,您可以简单地编写range(len(data)) ,或者甚至更像Python一样

     for y in data: y = y[1:41] 
  2. 根据后面的内容,您希望y的40个元素从第二个元素开始。 在这种情况下, y[1:41]是正确的(您不需要尾随:1 )。 如果您不想跳过第一个元素,请使用y[0:40] ,或者使用Python更好的y[:40] 请记住,索引是从零开始的,而停止索引是排他的

  3. y列表中的每个元素都不是数字。 这是一个字符串,您可以从文件中读取。 通常,您可以使用以下命令将其转换为数字列表

     y = [float(x) for x in y] 

    要么

     y = list(map(float, y)) 

    您的代码将为每个元素创建一个嵌套列表,并按数字对其进行拆分。 这真的是您想要的吗? 从其余的问题来看,肯定不是那样。

  4. create2Darray似乎期望包含4n数字的列表,并将其分解为大小为n-by-4的2D列表。 如果您现在想继续使用纯Python,可以使用range缩短代码:

     def create2Darray(arr): return [arr[i:i + 4] for i in range(0, len(arr), 4)] 
  5. 2D操作的结果通过label_data.append(y)附加到3D列表中。 当前,由于数字拆分, label_data是第4维label_data的4D列表。 这样添加列表是非常低效的。 对于在for循环主体中包含语句的小型函数,并在列表理解中使用它,您会做得更好。
  6. 最后,将4D数组(可能应该是3D)转换为numpy数组。 此操作失败,因为您的数字并非都具有相同的数字。 一旦您解决了第3步,该错误就会消失。 仍然存在一个问题,当您将所有内容显式转换为int时,为什么要dtype=np.float ,但这是您要找出的。
  7. 不要忘记为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM