从csv文件读取和写入np数组的问题

时间:2018-10-15 06:42:07

标签: python csv numpy

这是问题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.]

1 个答案:

答案 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