带字符串的Numpy字符串数组pad

2024-06-28 20:14:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个2d Numpy字符串数组,如下所示:

a = np.full((2, 3), '#', dtype=np.unicode)
print(a)

输出为:

^{pr2}$

我想加上“?”宽度为1的所有边。我希望输出为:

array([
['?', '?', '?', '?', '?'],
['?', '#', '#', '#', '?'],
['?', '#', '#', '#', '?'],
['?', '#', '#', '#', '?'],
['?', '?', '?', '?', '?']],
dtype=`'<U1')

我尝试了以下方法:

b = np.pad(a, ((1, 1), (1, 1)), 'constant', constant_values=(('?', '?'), ('?', '?')))

但这会产生以下错误:

File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/numpy/lib/arraypad.py", line 1357, in pad
    cast_to_int=False)
File "/usr/lib/python3/dist-packages/numpy/lib/arraypad.py", line 1069, in _normalize_shape
    return tuple(tuple(axis) for axis in arr.tolist())
AttributeError: 'tuple' object has no attribute 'tolist'

类似的代码也适用于整数。我怎么把弦弄错了?在


Tags: innumpylibpackagesusrdistnpline
2条回答

不能用字符串文字填充数组。如文档中所述,您可以使用pad_with函数,如下所示:

In [79]: def pad_with(vector, pad_width, iaxis, kwargs):
    ...:     pad_value = kwargs.get('padder', '?')
    ...:     vector[:pad_width[0]] = pad_value
    ...:     vector[-pad_width[1]:] = pad_value
    ...:     return vector
    ...: 

In [80]: 

In [80]: np.pad(a, 1, pad_with)
Out[80]: 
array([['?', '?', '?', '?', '?'],
       ['?', '#', '#', '#', '?'],
       ['?', '#', '#', '#', '?'],
       ['?', '#', '#', '#', '?'],
       ['?', '?', '?', '?', '?']], dtype='<U1')

注意,在pad_with函数的pad_value = kwargs.get('padder', '?')行中,您应该使用默认的填充值,以防np.pad的调用程序中没有提供填充参数。您可以将预期的padder作为关键字参数传递给函数。在

^{pr2}$

即使可以让pad工作,将a插入空白b也会更快。pad是为复杂的填充模式而设置的,它以迭代的方式执行任务—行一行,列一列。在

In [29]: a = np.full((2,3),'#')
In [30]: a
Out[30]: 
array([['#', '#', '#'],
       ['#', '#', '#']], dtype='<U1')
In [31]: b = np.full((4,5),'?')
In [32]: b
Out[32]: 
array([['?', '?', '?', '?', '?'],
       ['?', '?', '?', '?', '?'],
       ['?', '?', '?', '?', '?'],
       ['?', '?', '?', '?', '?']], dtype='<U1')
In [33]: b[1:-1,1:-1] = a
In [34]: b
Out[34]: 
array([['?', '?', '?', '?', '?'],
       ['?', '#', '#', '#', '?'],
       ['?', '#', '#', '#', '?'],
       ['?', '?', '?', '?', '?']], dtype='<U1')

这是一个聪明的pad_with解决方案,添加了一个打印,这样我们就可以看到它被调用的频率:

^{pr2}$

相关问题 更多 >