如何将NumPy数组的字符串表示形式转换为NumPy数组?

3

函数numpy.array_repr可用于创建NumPy数组的字符串表示形式。如何将NumPy数组的字符串表示形式转换为NumPy数组?

假设字符串表示形式如下:

array([-0.00470366,  0.00253503,  0.00306358, -0.00354276,  0.00743946,
       -0.00313205,  0.00318478,  0.0074185 , -0.00312317,  0.00127158,
        0.00249559,  0.00140165,  0.00053142, -0.00685036,  0.01367841,
       -0.0024475 ,  0.00120164, -0.00665447,  0.00145064,  0.00128595,
       -0.00094848,  0.0028348 , -0.01571732, -0.00150459,  0.00502642,
       -0.00259262,  0.00222584,  0.00431143, -0.00379282,  0.00630756,
        0.001324  , -0.00420992, -0.00808643,  0.00180546,  0.00586163,
        0.00177767, -0.0011724 , -0.00270304,  0.00505948,  0.00627092,
       -0.00496326,  0.00460142, -0.00177408, -0.00066973,  0.00226059,
        0.00501507, -0.00261056, -0.00617777,  0.00269939, -0.01023268,
        0.00338639,  0.00483614,  0.00086805,  0.00041314, -0.0099909 ,
        0.00356182, -0.00788026,  0.00245763,  0.00371736,  0.00343493,
       -0.00037843, -0.0013632 , -0.00210518,  0.00362144,  0.00061659,
       -0.0008905 , -0.01148648, -0.00292173, -0.00206425,  0.00606295,
        0.0041656 , -0.00407792,  0.00026893,  0.00078469,  0.00186181,
        0.00067565, -0.00811732,  0.00257632,  0.00177333, -0.00602056,
        0.00853466,  0.0016037 ,  0.00094006, -0.00018953, -0.00408413,
       -0.00994886,  0.01268128,  0.0080336 ,  0.00546633,  0.00372206,
        0.00228082,  0.00445107,  0.00236268,  0.01059031, -0.00106609,
       -0.00055983,  0.00371333,  0.0004037 ,  0.00632817,  0.00145055], dtype=float32)

这个怎么转换成NumPy数组呢?
2个回答

6

eval 是最简单的,它会将给定的字符串作为代码进行评估。

from numpy import array, all
arr_1 = array([1,2,3])
arr_string = repr(arr_1)
arr_2 = eval(arr_string)

all(arr_1 == arr_2) # True

请参考关于eval的文档:https://docs.python.org/2/library/functions.html#eval


如果我在你的解决方案中使用OP提到的numpy.arr_repr,就会出现错误。它会返回TypeError: 'numpy.ndarray' object is not callable - CoMartel
你把数组命名为array了吗?因为这会与numpy的array函数冲突。 - acdr
不,它可以使用您的示例,但如果您复制OP的示例数组,则无法正常工作。这可能只是一个复制粘贴问题。 - CoMartel
对我来说可以工作。我在我的代码中调用的只有 arrayreprevalall。你得到错误 'numpy.ndarray' object is not callable 的事实意味着其中一个是 numpy 数组。你在哪一行得到了异常? - acdr
当我使用arr_1=array(COPY_OF_OP_ARRAY)时,eval返回异常,因此我认为这只是复制粘贴的问题,而不是您的代码问题。 - CoMartel
请注意,仅当不发生摘要时,此功能才能正常工作。 - Kevin

4

我经常使用print语句进行调试。为了将numpy控制台输出读取回python环境,我使用了以下基于np.matrix的工具。

def string_to_numpy(text, dtype=None):
    """
    Convert text into 1D or 2D arrays using np.matrix().
    The result is returned as an np.ndarray.
    """
    import re
    text = text.strip()
    # Using a regexp, decide whether the array is flat or not.
    # The following matches either: "[1 2 3]" or "1 2 3"
    is_flat = bool(re.match(r"^(\[[^\[].+[^\]]\]|[^\[].+[^\]])$",
                            text, flags=re.S))
    # Replace newline characters with semicolons.
    text = text.replace("]\n", "];")
    # Prepare the result.
    result = np.asarray(np.matrix(text, dtype=dtype))
    return result.flatten() if is_flat else result

以下是我常用的调试工作流程:

1)在我的代码中...

import numpy as np
x = np.random.random((3,5)).round(decimals=2)
print(x)

这将数组的内容打印到控制台上,例如:
    [[0.24 0.68 0.57 0.37 0.83]
     [0.76 0.5  0.46 0.49 0.95]
     [0.39 0.37 0.48 0.69 0.25]]

为了进一步检查输出,我选择该文本并将其粘贴到ipython会话中,如下所示:
    In [9]: s2n = string_to_numpy # Short alias

    In [10]: x = s2n("""[[0.24 0.68 0.57 0.37 0.83]
                         [0.76 0.5  0.46 0.49 0.95]
                         [0.39 0.37 0.48 0.69 0.25]]""")
    In [11]: x.shape
    Out[11]: (3, 5)

    In [12]: x.mean(axis=1)
    Out[12]: array([0.538, 0.632, 0.436])
    
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接