将numpy数组保存到单元格中

2024-04-29 20:39:31 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我将一些numpy数组放入单元格的代码:

for name in tqdm(names):
   img = PIL.Image.open(os.path.join(TRAIN_IMG_DIR, name)).convert('RGB')
   img = np.array(img)
   idxs = tile(img)
   mydict[name] = [idxs]

df = pd.DataFrame.from_dict(mydict, orient='index').reset_index()
df.columns = ['ImageId', 'TileIds']
df.to_csv('36x224x224_otsu.csv')

其中:

ImageId TileIds
0   0eacb18986da2b25c5d82bd9676536e0_1.jpeg [50, 59, 122, 115, 150, 74, 66, 58, 143, 67, 2...
1   1796a7081ed86d83fddf677904d3843f_1.jpeg [96, 56, 66, 106, 43, 76, 86, 47, 45, 25, 116,...
2   9459f98d4b344c82d5c9b45a7af81b53_1.jpeg [375, 392, 184, 116, 248, 167, 217, 297, 99, 3...

到目前为止还不错,但当我加载csv文件并显示它时,我得到了:

    ImageId TileIds
0   0452381085998676ae1e3c877df5bd4d_1.jpeg [ 7 21 1 58 69 14 15 64 74 27 8 40 47 34 79 ...
1   bbb2c6d4f203c71ba63d6ce8048d1ebc_1.jpeg [171 193 68 159 113 79 136 67 124 102 57 2...
2   ee7818bcdaf1b51212aa523778f68ee8_1.jpeg [206 224 191 172 223 197 180 190 42 251 162 2...

逗号已消失,并插入了一些空格,因此无法按空格分割我的目标是使用该数组为图像列表编制索引。 我尝试过各种方法,比如pickle和更改分隔符,但到目前为止都失败了。谢谢你的帮助,谢谢


Tags: csv代码namenumpydfimgforindex
2条回答

一个简单的解决方法是在保存列表之前将其转换为字符串。然后,在加载后,将字符串拆分回列表。这将确保同样的结果

df["TileIds"] = df["TileIds"].str.join(",")
df.to_csv("df.csv", index=False)

然后,加载后:

df = pd.read_csv("df.csv")
df["TileIds"] = df["TileIds"].str.split(',')

数据帧基本上是二维结构。在单元格中放置列表或数组意味着在这些单元格中放置Python对象

要进行说明,请在一个单元格中创建一个包含数组的帧,在另一个单元格中创建一个列表:

In [347]: df = pd.DataFrame([None,None], columns=['a'])                         
In [348]: df                                                                    
Out[348]: 
      a
0  None
1  None
In [349]: df['a'][1]=[1,2,3]                                                    
In [350]: df['a'][0]=np.array([1,2,3])                                          
In [351]: df                                                                    
Out[351]: 
           a
0  [1, 2, 3]
1  [1, 2, 3]

保存它:

In [355]: df.to_csv('pd.csv', index=False)                                      
In [356]: cat pd.csv                                                            
a
[1 2 3]
"[1, 2, 3]"

数组已以print/str格式保存(带[],不带逗号)。列表也保存为字符串。它可以被引用,这样逗号就不会混淆默认的逗号分隔符

read_csv将这两个单元格作为字符串加载。它不会尝试将它们转换回某种排序Python对象:

In [357]: df1 = pd.read_csv('pd.csv')                                           
In [358]: df1                                                                   
Out[358]: 
           a
0    [1 2 3]
1  [1, 2, 3]
In [359]: type(df1['a'][0])                                                     
Out[359]: str
In [360]: type(df1['a'][1])                                                     
Out[360]: str

列表字符串可以轻松转换回字符串:

In [361]: eval(df1['a'][1])                                                     
Out[361]: [1, 2, 3]

转换数组str需要更多的工作。该格式不用于重新创建数组。对于大型数组(超过1000项),它甚至会有省略号缺失值

在数据帧单元中放置阵列本身就很麻烦。这个保存/加载问题只是一个问题

相关问题 更多 >