我正在通过在列表和数组中追加项目来计算一个numpy数组和普通列表的时间

时间:2018-08-07 19:14:11

标签: python numpy matplotlib data-visualization

将项目附加到numpy数组中时,将引发以下错误 TypeError:找不到必需的参数“ object”(位置1)

这是我的代码

import numpy as np
import time

list = []
start = time.time()
def normalsqrt(a):

    for b in range(a):
        list.append(b**(1/2))
normalsqrt(1000)
print((time.time() - start) * 1000)


a = np.array()
start = time.time()

def numpy_sqrt(size):
    for b in range(size):
        np.concatenate((a, np.array([a[b]])))

numpy_sqrt(1000)
print((time.time() - start) * 1000)

1 个答案:

答案 0 :(得分:1)

让您的列表功能自成一体:

def normalsqrt(a):
    alist=[]
    for b in range(a):
        alist.append(b**(1/2))
    return alist

In [225]: normalsqrt(3)
Out[225]: [0.0, 1.0, 1.4142135623730951]

ipython中,运行timeit很简单:

In [226]: %timeit normalsqrt(1000)
288 µs ± 278 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

现在使用串联方法。

首先,您的数组初始化错误:

In [228]: np.array()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-228-e4f3b47dc252> in <module>()
----> 1 np.array()

TypeError: Required argument 'object' (pos 1) not found

在交互式会话中测试此代码时,您应该已经发现了此问题。如果没有这样的会话来测试代码段,我永远不会编写Python代码。

重复级联很棘手。首先,它很慢,如时间测试所示。其次,很难创建合适的起始数组。您确实需要了解concatenate并正确创建数组才能正确执行。

在正确使用此功能之前,我甚至还尝试过几件事:

def numpy_sqrt(size):
    arr = np.zeros((0,), dtype=int)
    for b in range(size):
        value = np.array([b**(1/2)])
        arr = np.concatenate((arr, value), axis=0)
    return arr

arrvalue都必须是一维数组。 concatenate返回一个新数组;它无法在原地运行。

In [233]: numpy_sqrt(3)
Out[233]: array([0.        , 1.        , 1.41421356])

而且时间-比列表版本慢26倍:

In [235]: %timeit numpy_sqrt(1000)
7.92 ms ± 304 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

但是获取同一数组的另一种更简单的方法:

In [237]: np.arange(3)**(1/2)
Out[237]: array([0.        , 1.        , 1.41421356])
In [238]: timeit np.arange(1000)**(1/2)
103 µs ± 22.5 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)