将项目附加到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)
答案 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
arr
和value
都必须是一维数组。 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)