Python ValueError:使用序列设置数组元素。关于从csv读取数据
我正在尝试按行从csv加载数据,然后从每行创建2d数组并将其存储在数组中: 装载: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]
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]
,或者更pythonicaly[: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)