打印不带分隔符的布尔numpy数组



我想打印这个数组:

a = np.array([[0, 1, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0]], dtype=bool)

.8..
8888
....
....

无需遍历双循环中的每个元素。像这样的简洁函数:

def showGrid(g):
print(np.vectorize(lambda x: '8' if x else '.')(g))

但不带标准分隔符:

[['.' '8' '.' '.']
['8' '8' '8' '8']
['.' '.' '.' '.']
['.' '.' '.' '.']]

我找不到一种方法使np.set_printoptions放弃标准numpy数组格式分隔符。这可能吗?如果没有,请参考任何相关的numpy技巧。

首先,使用np.where来优化您当前的代码,这与使用np.vectorize包装的函数相同且更快:

>>> np.where(a, '8', '.')
array([['.', '8', '.', '.'],
['8', '8', '8', '8'],
['.', '.', '.', '.'],
['.', '.', '.', '.']], dtype='<U1')

要连接每行中的字符,我更喜欢使用ndarray.view,它将以非常低的成本创建视图。它将每行中的所有字符视为长度为4的字符串:

>>> np.where(a, '8', '.').view('<U4')
array([['.8..'],
['8888'],
['....'],
['....']], dtype='<U4')

然后使用ndarray.ravel()ndarray.flat将平面结果解包到print函数中,使用换行符作为分隔符:

>>> print(*np.where(a, '8', '.').view('<U4').flat, sep='n')
.8..
8888
....
....

或者使用str.join来获取完整的字符串:

>>> print('n'.join(np.where(a, '8', '.').view('<U4').flat))
.8..
8888
....
....

最新更新