Python 如何将3D字符串转换为在CSV中保存3D图像后生成的numpy数组
我有一个CSV文件,其中有一列包含图像数据。在保存到CSV之前,每个图像都是一个3D numpy数组。所以这个列的每个单元格都是一个3D数组。保存到CSV并使用pandas读取后,它们转换为字符串。现在我想从它们中重新创建一个数组。下面是我想转换成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))) 我尝试了这里描述的工作人员,但似
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是的,你是对的,打印时它包含…
,但这有什么问题?