向量化和 ValueError,但不是来自 "or" 和 "and" 运算符
Vectorization & ValueError, but not from "or" and "and" operators
这个 很好地解释了如何解决使用条件时出现的值错误,例如“或”代替 |,“和”代替 &。但是我在该链中看不到任何解决“ValueError,系列的真值不明确的问题。使用a.empty,a.bool(),a.item(), a.any() 或 a.all()" 尝试将矢量化与编写为将单个数字作为输入的函数一起使用时进行矢量化。
具体来说,Map 和 Apply 在这种情况下工作正常,但矢量化仍然会抛出 ValueError。
下面的代码,有人可以分享如何解决这个问题,以便在不修改函数(或不修改函数太多)的情况下使用矢量化吗?谢谢!
代码:
# import numpy and pandas, create dataframe.
import numpy as np
import pandas as pd
x = range(1000)
df = pd.DataFrame(data = x, columns = ['Number'])
# define simple function to return True or False if number passed in is prime
def is_prime(num):
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2,num):
if num % i == 0:
return False
return True
# Call various ways of applying the function to the data frame
df['map prime'] = list(map(is_prime, df['Number']))
df['apply prime'] = df['Number'].apply(is_prime)
# look at dataframe
in: df.head()
out: Number map prime apply prime
0 0 264 False False
1 1 907 False False
2 2 354 True True
3 3 583 True True
4 4 895 False False
# now try to vectorizing
in: df['optimize prime'] = is_prime(df['Number'])
out: ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
你可以试试 numpy 的 vectorize
:
vis_prime = np.vectorize(is_prime)
df['optimize prime'] = vis_prime(df['Number'])
这给你:
Number map prime apply prime optimize prime
0 0 False False False
1 1 False False False
2 2 True True True
3 3 True True True
4 4 False False False
In [133]: timeit df['map prime'] = list(map(is_prime, df['Number']))
6.25 ms ± 65.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [134]: timeit df['apply prime'] = df['Number'].apply(is_prime)
6.18 ms ± 27.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
np.vectorize
有一个重要的免责声明 - 它不是性能工具
In [137]: timeit df['optimize prime'] = vis_prime(df['Number'])
5.83 ms ± 7.28 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
它并不比 pandas
自己的 apply
迭代器快多少。
并通过简单的列表理解:
In [140]: timeit [is_prime(num) for num in x]
5.65 ms ± 10 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
要获得真正的“矢量化”加速,我们必须编写适用于整个数组的代码,或者在本例中为系列。
此功能具有内在的连续性。特别是
if num % i == 0:
return False
短路,没有遍历整个range(2,num)
。一些素筛也建立在以前的 num
的基础上
这个
具体来说,Map 和 Apply 在这种情况下工作正常,但矢量化仍然会抛出 ValueError。
下面的代码,有人可以分享如何解决这个问题,以便在不修改函数(或不修改函数太多)的情况下使用矢量化吗?谢谢!
代码:
# import numpy and pandas, create dataframe.
import numpy as np
import pandas as pd
x = range(1000)
df = pd.DataFrame(data = x, columns = ['Number'])
# define simple function to return True or False if number passed in is prime
def is_prime(num):
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2,num):
if num % i == 0:
return False
return True
# Call various ways of applying the function to the data frame
df['map prime'] = list(map(is_prime, df['Number']))
df['apply prime'] = df['Number'].apply(is_prime)
# look at dataframe
in: df.head()
out: Number map prime apply prime
0 0 264 False False
1 1 907 False False
2 2 354 True True
3 3 583 True True
4 4 895 False False
# now try to vectorizing
in: df['optimize prime'] = is_prime(df['Number'])
out: ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
你可以试试 numpy 的 vectorize
:
vis_prime = np.vectorize(is_prime)
df['optimize prime'] = vis_prime(df['Number'])
这给你:
Number map prime apply prime optimize prime
0 0 False False False
1 1 False False False
2 2 True True True
3 3 True True True
4 4 False False False
In [133]: timeit df['map prime'] = list(map(is_prime, df['Number']))
6.25 ms ± 65.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [134]: timeit df['apply prime'] = df['Number'].apply(is_prime)
6.18 ms ± 27.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
np.vectorize
有一个重要的免责声明 - 它不是性能工具
In [137]: timeit df['optimize prime'] = vis_prime(df['Number'])
5.83 ms ± 7.28 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
它并不比 pandas
自己的 apply
迭代器快多少。
并通过简单的列表理解:
In [140]: timeit [is_prime(num) for num in x]
5.65 ms ± 10 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
要获得真正的“矢量化”加速,我们必须编写适用于整个数组的代码,或者在本例中为系列。
此功能具有内在的连续性。特别是
if num % i == 0:
return False
短路,没有遍历整个range(2,num)
。一些素筛也建立在以前的 num