Numpy在数组的每个元素后面加一个点,我不能去掉它

2024-10-04 01:31:57 发布

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

我试着写一段代码,根据我给它的一系列频率生成一个声音文件,但已经达到了一个点,我们把整数值数组编译在一起,在每一个后面放一个小数点,这会破坏我生成的声音文件。你知道吗

我试着把它转换成一个列表,然后把所有元素转换成整数值,然后再转换回来。 这会删除点,但仍会损坏文件

这是我的密码:

import numpy as np
from scipy.io.wavfile import write

#Samples per second
sps = 44100

#Duration
duration = 0.1

def wavegen(build):
    final_array = np.array([])
    for i in build:
        freq = i
        eachnum = np.arange(duration * sps)
        waveform = np.sin(2 * np.pi * eachnum * freq / sps)
        waveform_quiet = waveform * 0.3
        waveform_integers = np.int16(waveform_quiet * 32767)
        final_array  = np.append(final_array, waveform_integers)
    print(final_array)
    write('sine.wav',sps, final_array)
wavegen([100, 50, 100, 50])

生成的数组如下所示:

[   0.  140.  280. ... -210. -140.  -70.]

Tags: importbuildnp整数数组arraywritefinal
2条回答

在循环中使用np.append效率很低。List append更好,因为它可以在适当的位置工作。np.appendnp.concatenate的一个cover函数,它为每个调用生成一个全新的数组(包含所有相关的复制)。你知道吗

def wavegen(build):
    alist = []
    for i in build:
        freq = i
        eachnum = np.arange(duration * sps)
        waveform = np.sin(2 * np.pi * eachnum * freq / sps)
        waveform_quiet = waveform * 0.3
        alist.append(waveform_integers * 32767)
    final_array = np.array(alist)      # 2d result
    # or final_array = np.hstack(alist)     # 1d
    final_array = final_array.astype(np.int16)  # change the dtype just once
    return final_array

获取小数点的原因是final_array = np.array([])是一个创建浮点型数组的过程。当用浮点型数组final_array附加整数数组waveform_integers时,得到的是浮点型数组,因为final_array被设置为使用浮点。你知道吗

要解决这个问题,可以使用final_array = np.array([], dtype='int16'),这样np.append中的两个数组都是int16数组,结果也是int16数组。你知道吗

相关问题 更多 >