首页 > 解决方案 > 我通过在列表和数组中附加项目来计算 numpy 数组和普通列表的时间

问题描述

在 numpy 数组中附加项目时,它会引发以下错误 TypeError: Required argument 'object' (pos 1) not found

这是我的代码

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)

标签: pythonnumpymatplotlibdata-visualization

解决方案


让我们让您的列表函数自包含:

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)

推荐阅读