这是问题I previously posted的(不同)继续。 我以前的csv文件格式错误,@ The Puternerd友善地建议我先将2d数组展平,然后再将其写入文件。
这就是我所拥有的:
output = open(CSVFilepath,"w")
csvwriter=csv.writer(output, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
for imagePath in glob.glob(MaskImagePath):
...
#myDescriptor is the 2d np array with varying rows and fixed columns (60)
myrow=[imageID,myDescriptor.shape[0],myDescriptor.flatten()]
这是我的csv文件现在的样子:
000000216739.jpg,224,[0. 0. 0. ... 0. 1. 2.]
000000001268.jpg,173,[0. 0. 0. ... 0. 1. 0.]
000000166259.jpg,195,[0. 0. 0. ... 0. 0. 2.]
000000368900.jpg,226,[0. 0. 0. ... 1. 1. 1.]
但是当我尝试使用以下方法检索第三项时:
with open(CSVFilepath,'r') as fin:
reader = csv.reader(fin,delimiter=',')
for row in reader:
print(row[2])
print(type(row[2]))
print(np.array(list(row[2])))
它返回:
[0. 0. 0. ... 1. 3. 2.]
<class 'str'>
['[' '0' '.' ' ' '0' '.' ' ' '0' '.' ' ' '.' '.' '.' ' ' '1' '.' ' ' '3' '.' ' ' '2' '.' ']']
这是否表示我没有正确保存值?任何建议将不胜感激!!!
**********更新**************
现在,请阅读下面的@Navneeth说明:
with open(CSVFilepath,'r') as fin:
reader = csv.reader(fin,delimiter=',')
for row in reader:
print(row[2])
print(type(row[2]))
a = row[2].replace("\n","")
print(a)
print(np.fromstring(a[1:-1], dtype=float, sep=" "))
但它会打印:
[0. 0. 0. ... 1. 2. 0.]
<class 'str'>
[0. 0. 0. ... 1. 2. 0.]
[0. 0. 0.]
[0. 0. 0. ... 1. 3. 2.]
<class 'str'>
[0. 0. 0. ... 1. 3. 2.]
[0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
<class 'str'>
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0.]
答案 0 :(得分:0)
CSV文件本身的编码没有问题。但是,CSVReader
无法识别您正在尝试从第三列读取numpy数组,因此它只是返回该numpy数组的字符串表示形式。
您的第三个打印语句使您感到奇怪的格式的原因是,在字符串上使用numpy.array
将导致numpy将其解释为单个字符的数组(这很自然,因为此函数将分解所有可迭代的元素放入其各个元素中,就像调用list("mystring")
一样。
这是使用numpy.fromstring
将字符串解释为numpy数组的一种简短方法。
def string_to_numpy(column):
return numpy.fromstring(column[1:-1], dtype=float, sep=" ")
拼接是必要的,因为numpy.fromstring
在输入中不期望[
和]
字符。该调用使用单个空格字符作为分隔符,但是如果这样做不够通用,您可能会更喜欢使用正则表达式。
请注意,此处生成的数组是平坦的。如果要恢复数组的维数,则必须在将维数提取为整数后使用numpy.array.reshape
。