Numpy vectorize () выравнивает весь массив - PullRequest
1 голос
/ 13 мая 2019

Мой ввод представляет собой массив кортежей

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)

Хотя я хочу векторизовать одно измерение, т. Е. Один кортежвыполняется внутри innerFunc, но мой вывод выглядит следующим образом:

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

Это означает, что функция векторизации выполняет векторизацию по двум измерениям, и я получаю следующую ошибку:

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 Ответ

2 голосов
/ 13 мая 2019
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, когда сработает простая итерация - медленнее и сложнее правильно использовать.

И посмотрите наваши массивы после их создания, убедившись, что вы понимаете форму и dtype.Не делайте предположений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...