Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将3D字符串转换为在CSV中保存3D图像后生成的numpy数组_Python_Numpy - Fatal编程技术网

Python 如何将3D字符串转换为在CSV中保存3D图像后生成的numpy数组

Python 如何将3D字符串转换为在CSV中保存3D图像后生成的numpy数组,python,numpy,Python,Numpy,我有一个CSV文件,其中有一列包含图像数据。在保存到CSV之前,每个图像都是一个3D numpy数组。所以这个列的每个单元格都是一个3D数组。保存到CSV并使用pandas读取后,它们转换为字符串。现在我想从它们中重新创建一个数组。下面是我想转换成3D numpy数组的字符串示例 import numpy as np my_string_array = str(np.random.randint(0, high=255, size=(51, 52, 3))) 我尝试了这里描述的工作人员,但似

我有一个CSV文件,其中有一列包含图像数据。在保存到CSV之前,每个图像都是一个3D numpy数组。所以这个列的每个单元格都是一个3D数组。保存到CSV并使用pandas读取后,它们转换为字符串。现在我想从它们中重新创建一个数组。下面是我想转换成3D numpy数组的字符串示例

import numpy as np

my_string_array = str(np.random.randint(0, high=255, size=(51, 52, 3)))
我尝试了这里描述的工作人员,但似乎我需要一些不同的东西,因为我有3D阵列

我知道如果在保存到CSV之前将数组转换为
list
,那么

import ast
my_array = np.array(ast.literal_eval(my_string_array))
这是可行的,但不幸的是事实并非如此。运行此命令后,我得到一个错误:

Traceback (most recent call last):

  File "/opt/lyp-venv/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3319, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)

  File "<ipython-input-25-3e5a6dae7682>", line 2, in <module>
    my_array = np.array(ast.literal_eval(my_string_array))

  File "/usr/lib/python3.7/ast.py", line 46, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')

  File "/usr/lib/python3.7/ast.py", line 35, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)

  File "<unknown>", line 1
    [[[205  60 145]
             ^  
SyntaxError: invalid syntax
回溯(最近一次呼叫最后一次):
文件“/opt/lyp-venv/lib/python3.7/site-packages/IPython/core/interactiveshell.py”,第3319行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第2行,在
my_array=np.array(ast.literal_eval(my_string_array))
文件“/usr/lib/python3.7/ast.py”,第46行,文本形式
node_或_string=parse(node_或_string,mode='eval')
文件“/usr/lib/python3.7/ast.py”,第35行,在parse中
返回编译(源、文件名、模式、仅PyCF\u AST)
文件“”,第1行
[[[205  60 145]
^  
SyntaxError:无效语法

关于您添加的错误:

ast.literal_eval(my_string_array)
....
[[[205  60 145]
         ^  
SyntaxError: invalid syntax
literal\u eval
适用于Python语法的有限子集。例如,它适用于有效的列表输入,例如
“[[205,60,145]]”
。但是错误消息中的字符串与之不匹配;它缺少逗号。
str(一个数组)
省略了逗号。
str(一个数组.tolist())
没有

大多数关于像这样加载
csv
文件的答案都强调需要用逗号替换空格(或空白分隔符)

因此,在这种情况下,错误与阵列为3d无关

让我举例说明:

制作三维阵列:

In [720]: arr = np.arange(24).reshape(2,3,4)                                                     

In [722]: arr                                                                                    
Out[722]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
它是
str
表示,这可能就是
pandas
写入csv的内容:

In [723]: str(arr)                                                                               
Out[723]: '[[[ 0  1  2  3]\n  [ 4  5  6  7]\n  [ 8  9 10 11]]\n\n [[12 13 14 15]\n  [16 17 18 19]\n  [20 21 22 23]]]'
将其与列表str的外观进行比较:

In [724]: arr.tolist()                                                                           
Out[724]: 
[[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]],
 [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]
In [725]: str(arr.tolist())                                                                      
Out[725]: '[[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]'
literal\u eval
对此三重嵌套列表字符串没有问题:

In [726]: ast.literal_eval(_)                                                                    
Out[726]: 
[[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]],
 [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]
应用于数组字符串的
literal\u eval
会产生错误:

In [727]: ast.literal_eval(Out[721])                                                             
Traceback (most recent call last):

  File "/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py", line 3319, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)

  File "<ipython-input-727-700e3f960e29>", line 1, in <module>
    ast.literal_eval(Out[721])

  File "/usr/lib/python3.6/ast.py", line 48, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')

  File "/usr/lib/python3.6/ast.py", line 35, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)

  File "<unknown>", line 1
    [[[ 0  1  2  3]
           ^
SyntaxError: invalid syntax
In[727]:ast.literal\u eval(Out[721])
回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py”,第3319行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第1行,在
ast.literal_eval(Out[721])
文件“/usr/lib/python3.6/ast.py”,第48行,文本形式
node_或_string=parse(node_或_string,mode='eval')
文件“/usr/lib/python3.6/ast.py”,第35行,在parse中
返回编译(源、文件名、模式、仅PyCF\u AST)
文件“”,第1行
[[[ 0  1  2  3]
^
SyntaxError:无效语法
我可能可以通过几个字符串替换来解决这个问题,有效地将
Out[721]
转换为
Out[725]

@Mad指出,如果数组足够大(超过1000个元素)
str
将生成一个压缩版本,将大量值替换为“…”。你可以自己验证。如果是这样,再多的字符串编辑也无法解决问题。该字符串没有用


在中,我的答案的值是有限的,因为您已经有了字符串。更好。我还提出了一些专门针对
pandas
csv中出现的字符串的问题。在任何情况下,您都需要注意字符串的详细信息,尤其是分隔符和特殊字符。

如果您的字符串确实有
I在it中,您将无法恢复数据。链接的问题完全回答了您的问题。它不仅限于2D@MadPhysicist你能指定哪一个吗?它不包含
如果你使用
打印(我的字符串数组)
打印(str(np.random.randint(0,高=255,大小=(51,52,3)),你将看不到它们)
结果为七个ellipses@MadPhysicist是的,你是对的,打印时它包含
,但这有什么问题?