社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

在Python/Tensorflow中:如何将2D数组的字符串表示形式从文本文件转换为TF可以使用的内容

deprekate • 3 年前 • 1373 次点击  

我需要从文本文件中加载包含2D数组字符串表示的行,以便以后在训练Tensorflow CNN时使用,但我无法将字符串转换为Tensorflow喜欢的格式。我尝试了apply/map/各种函数的各种组合,但总是出现一些神秘的错误。下面是一个玩具示例代码,它接近正常工作,但仍会抛出一个错误:

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray)
import tensorflow as tf
import numpy as np
import pandas as pd
from ast import literal_eval

def df_to_dataset(dataframe):
    Y = tf.convert_to_tensor( dataframe['Y'].values )
    X = tf.convert_to_tensor( dataframe['X'].apply(literal_eval).apply(np.array).values )
    return tf.data.Dataset.from_tensor_slices( ( X , Y ) )

data = [[ 1, "[[0,1],[0,1]]" ] , [ 0 , "[[1,0],[1,0]]" ]]
df = pd.DataFrame(data, columns=['Y','X'])
dataset = df_to_dataset(df)
for feature in dataset.take(1):
    print( feature )
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132859
 
1373 次点击  
文章 [ 1 ]  |  最新文章 3 年前
hpaulj
Reply   •   1 楼
hpaulj    4 年前

因此,您的数据框显示为:

In [161]: df
Out[161]: 
   Y              X
0  1  [[0,1],[0,1]]
1  0  [[1,0],[1,0]]

虽然这并没有显示字符串引号。

In [162]: df['Y'].values
Out[162]: array([1, 0])

这个 X 列是字符串的1d数组,对象数据类型:

In [163]: df['X'].values
Out[163]: array(['[[0,1],[0,1]]', '[[1,0],[1,0]]'], dtype=object)

在评估中, values 现在是一系列列表:

In [164]: from ast import literal_eval
In [165]: df['X'].apply(literal_eval)
Out[165]: 
0    [[0, 1], [0, 1]]
1    [[1, 0], [1, 0]]
Name: X, dtype: object
In [166]: df['X'].apply(literal_eval).values
Out[166]: array([list([[0, 1], [0, 1]]), list([[1, 0], [1, 0]])], dtype=object)

但如果我们将其提取为一个列表:

In [168]: df['X'].apply(literal_eval).to_list()
Out[168]: [[[0, 1], [0, 1]], [[1, 0], [1, 0]]]

我们可以很容易地将其转化为一个数组:

In [169]: np.array(_)
Out[169]: 
array([[[0, 1],
        [0, 1]],

       [[1, 0],
        [1, 0]]])

回到数组形式,我们可以使用 stack

In [170]: np.stack(df['X'].apply(literal_eval).values)
Out[170]: 
array([[[0, 1],
        [0, 1]],

       [[1, 0],
        [1, 0]]])

堆栈 就像 concatenate vstack 除了它增加了一个维度,表现得更像 np.array .

现在,tensorflow转换应该可以工作了。

你的第二个 apply ,仅将列表数组更改为数组数组。

In [174]: df['X'].apply(literal_eval).apply(np.array).values
Out[174]: 
array([array([[0, 1],
              [0, 1]]), array([[1, 0],
                               [1, 0]])], dtype=object)

np.stack 这方面也很有效。