我现在已经挣扎了好几个小时了。我想要做的是产生一个包含" dB"的数字的列表。之后(即0dB,1dB,2dB ......高达8dB)。这是为了节省我不得不为我生产的情节手动输入每个标签。
我首先尝试的是:
cb.ax.set_yticklabels([x + 'dB' for x in str(np.arange(0, 9))])
然而,这似乎完全弄乱了我的标签。所以,我采用了更长的方法来确切地了解这种理解产生了什么:
crange = np.arange(0,9)
crangedb = [x + 'dB' for x in str(crange)]
print crange
print crangedb
输出:
[0 1 2 3 4 5 6 7 8]
['[dB', '0dB', ' dB', '1dB', ' dB', '2dB', ' dB', '3dB', ' dB', '4dB', ' dB', '5dB', ' dB', '6dB', ' dB', '7dB', ' dB', '8dB', ']dB']
因此,虽然我的数字列表很好(正如预期的那样),但是一旦我尝试使用列表推导将dB附加到每个数字,每个值都会散布空白值或括号。我的语法似乎在我用Google搜索过的每一页都是正确的,所以我必须遗漏超级简单或超小的东西。
答案 0 :(得分:2)
您正在将np.arange
转换为基本上为"[1 2 3 4...]"
的字符串,然后您将迭代每个字符。这意味着x=['[','0',' ',...]
。正确的行应该是:
cb.ax.set_yticklabels([str(x) + 'dB' for x in np.arange(0, 9)])
现在,您要将np.ndarray
的每个项目映射到字符串,并将其与'dB'
连接。
答案 1 :(得分:2)
最好使用range
代替np.arange
执行该任务:
In [105]: [str(i) + 'dB' for i in range(9)]
Out[105]: ['0dB', '1dB', '2dB', '3dB', '4dB', '5dB', '6dB', '7dB', '8dB']
<强>时序强>:
In [106]: %timeit [str(i) + 'dB' for i in range(9)]
100000 loops, best of 3: 4.06 us per loop
In [107]: %timeit [str(i) + 'dB' for i in np.arange(0,9)]
10000 loops, best of 3: 28.6 us per loop
答案 2 :(得分:2)
首先无需将crange
更改为字符串。当你这样做然后迭代它时,你得到list
的文字字符串表示的每个字符。
crange
:
[0 1 2 3 4 5 6 7 8]
str(crange)
:
'[0 1 2 3 4 5 6 7 8]'
crange
中的第一个元素是0
,但str(crange)
中的第一个元素是字符串'['
。这会产生您看到的结果。
而是围绕str()
:
x
来电
crangedb = [str(x) + 'dB' for x in crange]
这将产生所需的结果。您还可以使用字符串格式:
crangedb = ['{}dB'.format(x) for x in crange]
答案 3 :(得分:0)
您可以使用map
:
map(lambda x:"{}db".format(x), change)
使用范围:
map(lambda x:"{}db".format(x), range(0,9))