【问题标题】:problems with reading and writing np array from and to csv file从 csv 文件读取和写入 np 数组的问题
【发布时间】:2018-10-15 06:42:07
【问题描述】:

这是问题 I previously posted 的(不同)延续。 我以前的 csv 文件格式错误,@The Puternerd 建议我在将二维数组写入文件之前先将其展平。

这就是我所拥有的:

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.]

【问题讨论】:

    标签: python csv numpy


    【解决方案1】:

    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。

    【讨论】:

    • 当我尝试这样做时:for row in reader: print(np.fromstring(row[2][1:-1], dtype=float, sep="")) 它只返回这个:[0。 0. 0.](省略号前的第一部分)我是否误解了您的说明?
    • 不应该有省略号。我以为你把它们留作占位符。将 numpy 数组转换为字符串的一种方法似乎是 str(myarray).replace("\n","")
    • 对不起,我真的不明白你的指示...我会更新代码,所以它可能更清晰..?
    • 我是说 CSV 文件首先不应该有省略号。您没有在 CSV 中正确编码 numpy 数组。
    • 哦...我以为您说对 csv 文件的编码没有问题,但是既然这样,请问我应该如何对其进行编码?
    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多