Python Numpy沿\u轴应用\u推断错误的数据类型
我在使用NumPy时遇到以下问题: 代码: 我可以看到NumPy以某种方式从函数返回的第一个值推断数据类型。我提出了以下解决方法-使用显式声明的dtype(而不是字符串)从函数返回NumPy数组,并重新格式化结果:Python Numpy沿\u轴应用\u推断错误的数据类型,python,numpy,Python,Numpy,我在使用NumPy时遇到以下问题: 代码: 我可以看到NumPy以某种方式从函数返回的第一个值推断数据类型。我提出了以下解决方法-使用显式声明的dtype(而不是字符串)从函数返回NumPy数组,并重新格式化结果: def get_label_2(x): if x.sum() <= 10: return np.array(['SMALL'], dtype='|S5') else: return np.array(['BIG'], dtype=
def get_label_2(x):
if x.sum() <= 10:
return np.array(['SMALL'], dtype='|S5')
else:
return np.array(['BIG'], dtype='|S5')
arr = np.array([[30, 40], [1, 2]])
print np.apply_along_axis(get_label_2, 1, arr).reshape(arr.shape[0])
def get_label_2(x):
如果x.sum()您可以使用np.where
:
arr1 = np.array([[1, 2], [30, 40]])
arr2 = np.array([[30, 40], [1, 2]])
print(np.where(arr1.sum(axis=1)<=10,'SMALL','BIG'))
print(np.where(arr2.sum(axis=1)<=10,'SMALL','BIG'))
['SMALL' 'BIG']
['BIG' 'SMALL']
arr1=np.array([[1,2],[30,40]]
arr2=np.数组([[30,40],[1,2]]
打印(np.where(arr1.sum(axis=1)沿轴应用不是一个优雅的解决方案;它很方便,但不快速。本质上是这样的
In [277]: get_label = lambda x: 'SMALL' if x.sum() <= 10 else 'BIG'
In [279]: np.array([get_label(row) for row in np.array([[30,40],[1,2]])])
Out[279]:
array(['BIG', 'SMALL'],
dtype='<U5')
In [280]: res = np.zeros((2,),dtype='S5')
In [281]: arr = np.array([[30,40],[1,2]])
In [282]: for i in range(2):
...: res[i] = get_label(arr[i,:])
...:
In [283]: res
Out[283]:
array([b'BIG', b'SMALL'],
dtype='|S5')
优雅的解决方案是避免Python级别的显式或隐藏循环,而是使用编译的数组方法,比如给sum
一个轴:
In [284]: arr.sum(axis=1)
Out[284]: array([70, 3])
它使用第一个输入从测试计算中推断出数据类型。如果返回“BIG”,则字符串大小设置为3个字符长。
def get_label(x, threshold, axis=1, label1='SMALL', label2='BIG'):
return np.where(x.sum(axis=axis) <= threshold, label1, label2)
In [277]: get_label = lambda x: 'SMALL' if x.sum() <= 10 else 'BIG'
In [279]: np.array([get_label(row) for row in np.array([[30,40],[1,2]])])
Out[279]:
array(['BIG', 'SMALL'],
dtype='<U5')
In [280]: res = np.zeros((2,),dtype='S5')
In [281]: arr = np.array([[30,40],[1,2]])
In [282]: for i in range(2):
...: res[i] = get_label(arr[i,:])
...:
In [283]: res
Out[283]:
array([b'BIG', b'SMALL'],
dtype='|S5')
In [278]: np.array([get_label(row) for row in np.array([[1,2],[30,40]])])
Out[278]:
array(['SMALL', 'BIG'],
dtype='<U5')
In [279]: np.array([get_label(row) for row in np.array([[30,40],[1,2]])])
Out[279]:
array(['BIG', 'SMALL'],
dtype='<U5')
In [284]: arr.sum(axis=1)
Out[284]: array([70, 3])