假设我有一个 numpy 矩阵,如下所示:
matrix = np.zeros((5,5))
# goes through code that changes value of matrix to get:
[[0. 4. 7. 1. 3.]
[5. 6. 8. 0. 1.]
[inf inf 5. 2. 5.]
[4. 6. 2. 1. inf]]
打印此矩阵时,我想在某些元素的两侧添加 2 个星号符号:
[[0. *4* 7. 1. 3.]
[5. 6. *8* 0. 1.]
[inf inf 5. 2. 5.]
[4. *6* 2. *1* inf]]
我将如何做到这一点?
我试过了:
matrix_output = matrix
matrix_output[i][j] = '*' + str(matrix_for_print[i][j]) + '*'
但是我收到此错误:
builtins.ValueError: could not convert string to float: '*4.0*'
(另外,旁注,我如何让矩阵只有逗号而不是像这里这样的小数。所以理想情况下,我希望:
[[0, *4*, 7, 1, 3]
[5, 6, *8*, 0, 1]
[inf, inf, 5, 2, 5]
[4, *6*, 2, *1*, inf]]
我想知道这些调整是否真的值得? 但首先要确保你了解每个阶段你有什么对象,以及它们为什么会这样显示。
从像您这样的更简单的数组开始:
In [163]: arr = np.array([[0, 4,7],[np.inf, 0,3]])
In [164]: arr
Out[164]:
array([[ 0., 4., 7.],
[inf, 0., 3.]])
In [165]: arr.dtype
Out[165]: dtype('float64')
即使数字是整数,dtype 也是浮点数。np.inf
是浮动的。 此外,默认情况下np.zeros
会生成浮点数。
您可以将其更改为列表列表:
In [166]: alist = arr.tolist()
In [167]: alist
Out[167]: [[0.0, 4.0, 7.0], [inf, 0.0, 3.0]]
请注意,此显示包括逗号和 0。 并且不会将其分成几行。 但是作为一个列表,我们可以将单个项目更改为字符串:
In [168]: alist[0][2] = '*7*'
In [169]: alist
Out[169]: [[0.0, 4.0, '*7*'], [inf, 0.0, 3.0]]
甚至回到字符数组:
In [170]: np.array(alist)
Out[170]:
array([['0.0', '4.0', '*7*'],
['inf', '0.0', '3.0']], dtype='<U32')
print
会省略逗号和 dtype,但仍会显示引号。
我们还可以使用以下命令将其转换为字符数组:
In [171]: arr.astype(str)
Out[171]:
array([['0.0', '4.0', '7.0'],
['inf', '0.0', '3.0']], dtype='<U32')
并更改字符串。 注意 dtype 大小。 这是 32 个字符宽。 如果它被'<U3'
我们就不能添加额外的字符。
In [172]: _[0,2] = '*7*'
In [173]: _171
Out[173]:
array([['0.0', '4.0', '*7*'],
['inf', '0.0', '3.0']], dtype='<U32')
为了摆脱小数,我们可以转换为int
dtype - 但这会搞砸inf
.
In [174]: arr.astype(int)
Out[174]:
array([[ 0, 4, 7],
[-9223372036854775808, 0, 3]])
因此,您可以对数组执行的操作存在限制,并且仍然以一致的方式显示所有元素。
但是,如果您足够挑剔,则可以使用标准的Python格式表达式显式格式化数组(或列表列表(。 例如:
In [185]: astr = []
In [186]: for row in arr:
...: str1 = ['%s'%i for i in row]
...: astr.append(str1)
...:
In [187]: 'n'.join([', '.join(row) for row in astr])
Out[187]: '0.0, 4.0, 7.0ninf, 0.0, 3.0'
In [188]: print(_)
0.0, 4.0, 7.0
inf, 0.0, 3.0
使用joins
我只生成一个字符串,而不是数组或字符串列表。 这摆脱了引号。 我会添加进一步的测试来将浮点数更改为 int,而不会损害inf
. 并以某种方式确定哪些元素获得 *。 您可以编写一个函数来获取元素,并处理所有整数与浮点数(或 inf(细节以及添加突出显示。
自定义类的__str__
或__repr__
方法需要对格式设置详细信息给予相同的关注。当你的期望偏离了通常的做法时,就没有办法解决这个问题。