Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy沿\u轴应用\u推断错误的数据类型_Python_Numpy - Fatal编程技术网

Python Numpy沿\u轴应用\u推断错误的数据类型

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=

我在使用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='|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])