我可以使用np.arange列表作为输入吗?

时间:2016-09-29 08:24:11

标签: python python-3.x numpy

我的代码的相关摘录如下:

import numpy as np

def create_function(duration, start, stop):
    rates = np.linspace(start, stop, duration*1000)
    return rates

def generate_spikes(duration, start, stop):
    rates = [create_function(duration, start, stop)]
    array = [np.arange(0, (duration*1000), 1)]
    start_value = [np.repeat(start, duration*1000)]
    double_array = [np.add(array,array)]
    times = np.arange(np.add(start_value,array), np.add(start_value,double_array), rates)
    return times/1000.

我知道这是非常低效的编码(特别是start_value和double_array的东西),但它都是试图以某种方式使用arange列表作为我的输入的产物。

我一直收到这个错误:

Type Error: int() argument must be a string, a bytes-like element, or a number, not 'list'

基本上,我正在尝试做的一个例子是:

我有两个数组a = [1, 2, 3, 4]b = [0.1, 0.2, 0.3, 0.4],我想使用np.arange生成[1.1, 1.2, 1.3, 2.2, 2.4, 2.6, 3.3, 3.6, 3.9, 4.4, 4.8, 5.2]? (我将为数组中的每个元素使用不同的步长。)

这甚至可能吗?如果是这样,我是否必须压扁我的名单?

1 个答案:

答案 0 :(得分:1)

您可以在那里使用broadcasting来提高效率 -

(a + (b[:,None] * a)).ravel('F')

示例运行 -

In [52]: a
Out[52]: array([1, 2, 3, 4])

In [53]: b
Out[53]: array([ 0.1,  0.2,  0.3,  0.4])

In [54]: (a + (b[:,None] * a)).ravel('F')
Out[54]: 
array([ 1.1,  1.2,  1.3,  1.4,  2.2,  2.4,  2.6,  2.8,  3.3,  3.6,  3.9,
        4.2,  4.4,  4.8,  5.2,  5.6])

查看预期输出,您似乎只使用b之外的前三个元素进行计算。因此,为了实现该目标,我们只需切片前三个元素并进行计算,如此 -

In [55]: (a + (b[:3,None] * a)).ravel('F')
Out[55]: 
array([ 1.1,  1.2,  1.3,  2.2,  2.4,  2.6,  3.3,  3.6,  3.9,  4.4,  4.8,
        5.2])