在 numpy 数组中追加项目时,抛出以下错误 类型错误:未找到所需参数“对象”(位置 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)
最佳答案
让我们让您的列表函数自包含:
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
在交互式 session 中测试此代码时,您应该立即发现这一点。如果没有这样的 session 来测试代码片段,我永远不会编写 Python 代码。
重复串联很棘手。首先,正如时间测试所表明的那样,它很慢。其次,很难创建一个合适的起始数组。您确实需要很好地理解连接
和数组创建才能正确完成。
在正确使用此功能之前,我也必须尝试一些事情:
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)
关于python - 我通过在列表和数组中附加项目来计算 numpy 数组和普通列表的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51733904/