Numpy vectorize()使整个数组变平

时间:2019-05-13 09:33:01

标签: python numpy vectorization

我的输入是一个元组的numpy数组

values = np.array([(4, 5, 2, 18), (4, 7, 3, 8)])

我的功能如下:

def outerFunc(values):
    print(values)
    def innerFunc(values):
        print(values)
        mean = np.mean(values)
        result = 0
        for i in range(len(values)):
            result += math.pow(values[i] - mean, 2)
        return result

    if isinstance(values, np.ndarray):
        return np.vectorize(innerFunc)(values)
    else:
        return innerFunc(values)

尽管我想向量化1维,即在innerFunc内部执行一个元组,但是我的输出如下:

[[ 4  5  2 18]
 [ 4  7  3  8]]
4
...

这意味着vectorize函数正在2维上进行矢量化,并且出现以下错误:

for i in range(len(values)):
TypeError: object of type 'numpy.int64' has no len()

要进行哪些更改,以便输出为:

[[ 4  5  2 18]
 [ 4  7  3  8]]
[4  5  2 18]
...

类似的东西

谢谢。

编辑

当元组长度不同时,它可以正常工作,任何人都可以解释一下,

例如,我的输入是

np.array([(4, 5, 2, 18), (4, 7, 3,)])

函数会打印

[(4, 5, 2, 18) (4, 7, 3)]
(4, 5, 2, 18)
(4, 7, 3)

,返回值为

[158.75         8.66666667]

因此,仅当所有元组的长度相同时,该函数才会将它们视为数字。

谢谢。

1 个答案:

答案 0 :(得分:2)

In [1]: values = np.array([(4, 5, 2, 18), (4, 7, 3, 8)])                        
In [2]: values                                                                  
Out[2]: 
array([[ 4,  5,  2, 18],
       [ 4,  7,  3,  8]])
In [3]: values.shape                                                            
Out[3]: (2, 4)
In [4]: x=np.array([(4, 5, 2, 18), (4, 7, 3,)])                                 
In [5]: x                                                                       
Out[5]: array([(4, 5, 2, 18), (4, 7, 3)], dtype=object)
In [6]: x.shape                                                                 
Out[6]: (2,)

values是一个二维数字数组。 np.vectorize将8个元素中的每个元素一次传递给您的内部函数。它不会按行迭代。

x是具有2个元素(元组)的一维数组。 vectorize会将每个元组传递到您的内部。

当简单的迭代可行时,不要使用vectorize-使用right会更慢,更难。

在创建数组后查看它们,确保您了解形状和dtype。不要做假设。