如何在numpy矩阵中的某个元素中添加非数字字符?



假设我有一个 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')

为了摆脱小数,我们可以转换为intdtype - 但这会搞砸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__方法需要对格式设置详细信息给予相同的关注。当你的期望偏离了通常的做法时,就没有办法解决这个问题。

最新更新