59

我有一个 numpy 数组,例如:

points = np.array([[-468.927,  -11.299,   76.271, -536.723],
                   [-429.379, -694.915, -214.689,  745.763],
                   [   0.,       0.,       0.,       0.   ]])

如果我打印它或使用 str() 将其转换为字符串,我会得到:

print w_points
[[-468.927  -11.299   76.271 -536.723]
 [-429.379 -694.915 -214.689  745.763]
 [   0.       0.       0.       0.   ]]

我需要把它变成一个用逗号分隔的字符串,同时保持二维数组结构,即:

[[-468.927,  -11.299,   76.271, -536.723],
 [-429.379, -694.915, -214.689,  745.763],
 [   0.,       0.,       0.,       0.   ]]

有人知道将 numpy 数组转换为那种形式的字符串的简单方法吗?

我知道 .tolist() 添加了逗号,但结果丢失了 2D 结构。

4

4 回答 4

77

尝试使用repr

>>> import numpy as np
>>> points = np.array([[-468.927,  -11.299,   76.271, -536.723],
...                    [-429.379, -694.915, -214.689,  745.763],
...                    [   0.,       0.,       0.,       0.   ]])
>>> print(repr(points))
array([[-468.927,  -11.299,   76.271, -536.723],
       [-429.379, -694.915, -214.689,  745.763],
       [   0.   ,    0.   ,    0.   ,    0.   ]])

如果您打算使用大型 numpy 数组,np.set_printoptions(threshold=np.nan)请先设置。没有它,数组表示将在大约 1000 个条目后被截断(默认情况下)。

>>> arr = np.arange(1001)
>>> print(repr(arr))
array([   0,    1,    2, ...,  998,  999, 1000])

当然,如果你有这么大的数组,这开始变得不那么有用了,你可能应该以某种方式分析数据,而不仅仅是查看它,并且有更好的方法来持久化一个 numpy 数组而不是将它保存repr到文件中......

于 2013-05-07T16:13:35.537 回答
39

现在,在 numpy 1.11 中,有numpy.array2string

In [279]: a = np.reshape(np.arange(25, dtype='int8'), (5, 5))

In [280]: print(np.array2string(a, separator=', '))
[[ 0,  1,  2,  3,  4],
 [ 5,  6,  7,  8,  9],
 [10, 11, 12, 13, 14],
 [15, 16, 17, 18, 19],
 [20, 21, 22, 23, 24]]

repr来自@mgilson 的比较(显示“array()”和dtype):

In [281]: print(repr(a))
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, 24]], dtype=int8)

PS 仍然需要np.set_printoptions(threshold=np.nan)大阵列。

于 2017-01-12T13:51:28.437 回答
2

另一种方法是使用 Python 的 pprint 模块(它具有各种格式化选项),这在对象没有 __repr__() 方法时特别有用。下面是它的样子,例如:

>>> import numpy as np
>>> import pprint
>>>
>>> A = np.zeros(10, dtype=np.int64)
>>>
>>> print(A)
[0 0 0 0 0 0 0 0 0 0]
>>>
>>> pprint.pprint(A)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
于 2014-05-07T21:54:11.517 回答
1

您正在寻找的功能是np.set_string_function. 资源

此函数的作用是让您覆盖 numpy 对象的默认值__str____repr__函数。如果将该repr标志设置为 True,则该__repr__函数将被您的自定义函数覆盖。同样,如果您设置repr=False,该__str__功能将被覆盖。由于print调用了__str__对象的函数,我们需要设置repr=False.

例如:

np.set_string_function(lambda x: repr(x), repr=False)
x = np.arange(5)
print(x)

将打印输出

array([0, 1, 2, 3, 4])

更美观的版本是

np.set_string_function(lambda x: repr(x).replace('(', '').replace(')', '').replace('array', '').replace("       ", ' ') , repr=False)

print(np.eye(3))

这使

[[1., 0., 0.],
 [0., 1., 0.],
 [0., 0., 1.]]

希望这能回答你的问题。

于 2020-06-25T01:07:24.450 回答