Numpy在我不能剥离的数组的每个元素之后添加一个点

时间:2019-12-13 18:30:27

标签: python numpy scipy

我正在尝试编写代码,该代码根据我给定的一系列频率生成声音文件,但已达到一定程度,将整数值的数组汇总在一起会在每个破坏声音文件的小数点后加一个小数点。产生。

我尝试将其转换为列表,然后将所有元素转换为整数值,然后将其转换回。 这样可以删除圆点,但仍会损坏文件

这是我的代码:

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.]

2 个答案:

答案 0 :(得分:2)

获得小数位的原因是因为final_array = np.array([])是一个创建浮点型数组。当您将整数数组waveform_integers附加到浮点型数组final_array时,由于final_array设置为使用浮点数,所以您得到的是浮点型数组。

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

答案 1 :(得分:0)

在循环中使用np.append效率低下。列表附加更好,因为它可以就地工作。 np.appendnp.concatenate的掩盖函数,它每次调用都会创建一个全新的数组(包括所有涉及的复制)。

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