Python ValueError:使用序列设置数组元素。关于从csv读取数据

Python ValueError:使用序列设置数组元素。关于从csv读取数据,python,python-3.x,numpy,Python,Python 3.x,Numpy,我正在尝试按行从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]

我正在尝试按行从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
我的csv有格式

number, number, number
行中的基本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=',')
数据
是一个二维浮点数数组:

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:][/code>

我可以分别加载文件名:

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')
[373]中的
:labels=np.genfromtxt(txt,分隔符=',',usecols=[0],dtype=None,encoding=None)
在[374]中:标签
Out[374]:
数组(['frame\u video\u 02\u 0.jpg','frame\u video\u 02\u 50.jpg',

“frame_video_02_100.jpg'],dtype=”让我们从头开始:

  • 您似乎希望迭代文件的每一行以创建数组。迭代应该在
    范围(0,len(data))
    之上,而不是
    范围(0,len(data)-1)
    :范围的最后一个元素是独占的,因此您当前跳过了最后一行。事实上,您可以简单地编写
    范围(len(data))
    ,或者更像蟒蛇的东西,去做吧

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

  • y
    列表中的每个元素都不是数字。它是一个字符串,可以从文件中读取。通常,可以使用

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

    您的代码将为每个元素创建一个嵌套列表,并将其按位数拆分。这真的是您想要的吗?与问题的其余部分显然不是这样

  • create2Darray
    似乎需要一个
    4n
    数字列表,并将其分解为一个大小为
    n×4
    的2D列表。如果您想在此时继续使用纯Python,可以使用
    范围
    缩短代码:

    def create2Darray(arr):
        return [arr[i:i + 4] for i in range(0, len(arr), 4)]
    
  • 2D操作的结果被附加到带有
    label\u数据的3D列表中。附加(y)
    。目前,由于数字拆分,
    label\u data
    是一个4D列表,第四维参差不齐。以这种方式附加列表的效率非常低。最好在
    for
    循环的主体中有一个包含语句的小函数,并将其用于列表理解
  • 最后,转换4D阵列(可能是3D阵列),转换为numpy数组。此操作失败,因为您的数字的位数不尽相同。一旦修复步骤#3,错误就会消失。仍然存在这样一个问题:当您将所有内容显式转换为
    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)
    

    您的变量
    数据
    看起来像什么?您是否尝试过
    np.genfromtxt
    ?我的数据变量看起来像2D数组(至少在打印后)使用
    pandas
    读取
    csv
    并执行操作,然后使用
    loc
    iloc
    将它们分割成
    系列
    ,直接转换成
    np.array
    。您也可以使用
    .dropna()
    要删除任何
    非类型的值
    @iam.Carrot您介意举个例子吗?我对python不太熟悉。谢谢您为什么不只是通过
    范围(1,41)
    usecols
    第一次吗?@MadPhysicast。我太懒了,不想使用那样复杂的
    usecols
    参数!我甚至不确定它是否会起作用。希望你能帮我测试一下:)范围是否起作用-但你必须提前知道有多少列。@hpaulij。OP似乎心中有一个特别的数字。2D convert表示他们希望在任何时候都使用4的倍数。
    def create2Darray(arr):
        return [arr[i:i + 4] for i in range(0, len(arr), 4)]
    
    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)