我在64位Win1o上使用Python 3。我遇到了以下简单功能的问题:
def skudiscounT(t):
s = t.find("ITEMADJ")
if s >= 0:
t = t[s + 8:]
if t.find("-") == 2:
return t
else:
return np.nan # if change to "" it will work fine!
我尝试在np.Vectorize中使用此功能,并收到以下错误:
Traceback (most recent call last):
File "C:/Users/lz09/Desktop/P3/SODetails_Clean_V1.py", line 45, in <module>
SO["SKUDiscount"] = np.vectorize(skudiscounT)(SO['Description'])
File "C:\PD\Anaconda3\lib\site-packages\numpy\lib\function_base.py", line 2739, in __call__
return self._vectorize_call(func=func, args=vargs)
File "C:\PD\Anaconda3\lib\site-packages\numpy\lib\function_base.py", line 2818, in _vectorize_call
res = array(outputs, copy=False, subok=True, dtype=otypes[0])
ValueError: could not convert string to float: '23-126-408'
当我将最后一行[return np.nan]替换为[return&#39;&#39;]时,它工作正常。有人知道为什么会这样吗?谢谢!
答案 0 :(得分:0)
如果没有otypes
,则返回数组的dtype由第一个试验结果确定:
In [232]: f = np.vectorize(skudiscounT)
In [234]: f(['abc'])
Out[234]: array([ nan])
In [235]: _.dtype
Out[235]: dtype('float64')
我试图找到一个返回字符串的参数。您的函数看起来也可以返回None
。
来自文档:
vectorized
输出的数据类型由调用确定 具有输入的第一个元素的函数。这可以避免 通过指定otypes
参数。
使用otypes
:
In [246]: f = np.vectorize(skudiscounT, otypes=[object])
In [247]: f(['abc', '23-126ITEMADJ408'])
Out[247]: array([nan, None], dtype=object)
In [248]: f = np.vectorize(skudiscounT, otypes=['U10'])
In [249]: f(['abc', '23-126ITEMADJ408'])
Out[249]:
array(['nan', 'None'],
dtype='<U4')
但是要返回通用的object
dtype,我会稍快一些:
In [250]: g = np.frompyfunc(skudiscounT, 1,1)
In [251]: g(['abc', '23-126ITEMADJ408'])
Out[251]: array([nan, None], dtype=object)
那么你想要什么样的阵列?可以容纳float
,np.nan
的{{1}}?或string
可以举行任何事情&#39;。