Мне нужна небольшая помощь. У меня два массива. Скажем

alpha = np.arange(1,5,1) ==> [1,2,3,4] 
beta = np.arange(5,8,1) ==> [5,6,7] 

Как использовать значения альфа и бета, вызвать функцию и назначить возврат функции в массив, количество строк которого совпадает с количеством элементов в бета-версии, а количество столбцов совпадает с количеством элементов в альфа .

matrix_assign = np.zeros_like((alpha, beta), dtype = 'float')

+---+---+---+---+---+
|   | 1 | 2 | 3 | 4 |
+---+---+---+---+---+
| 5 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+
| 6 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+
| 7 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+

Функция, которая у меня есть, немного сложнее, поэтому для этой цели давайте заставим функцию делать

np.sqrt((alpha-beta)^2)

Это код, который у меня есть, но он, похоже, не работает. По сути, i в альфа и j в бета входят в функцию, а возвращаемое значение должно заменять ноль в соответствующей ячейке.

 for i in range(alpha):
        for j in range(beta):
            matrix_assign[i,j] = fn.sample_function(i,j)

Например, когда alpha[0] и beta[1] входят в функцию, выход 5 назначается ячейке matrix_assign[1,0]

Спасибо

РЕДАКТИРОВАТЬ:

import numpy as np

alpha = np.arange(1,5,1) #==> [1,2,3,4] 
beta = np.arange(5,8,1) #==> [5,6,7] 

matrix_assign = np.zeros_like((alpha, beta), dtype = 'float')

for i in range(alpha):
    for j in range(beta):
        matrix_assign[i,j] = np.sqrt((alpha-beta)^2)

Почему приведенный выше код не работает? Я получаю ошибку

for i in range(alpha):
    TypeError: only integer scalar arrays can be converted to a scalar index

Использование range(len(alpha)) также не работает. Я получаю ошибку

matrix_assign[i,j] = np.sqrt((alpha-beta)^2) 
    ValueError: operands could not be broadcast together with shapes (4,) (3,)
    
0
Barry 10 Ноя 2020 в 11:39

2 ответа

Лучший ответ

Ваш код должен быть:

import numpy as np

alpha = np.arange(1,5,1) #==> [1,2,3,4] 
beta = np.arange(5,8,1) #==> [5,6,7] 

matrix_assign = np.zeros_like((alpha, beta), dtype = 'float')

for i in range(alpha.size):
    for j in range(beta.size):
        matrix_assign[i,j] = fn.sample_function(alpha[i], beta[j])

Fn.sample_function требует отдельных значений alpha и beta, а не индексов. Однако это очень медленно.

Если ваш fn.sample_function векторизован, вы можете сделать это:

A, B = np.meshgrid(alpha, beta)
matrix_assign = fn.sample_function(A, B)

Вы также можете смешать любую функцию для псевдо-векторизации, используя np.vectorize.

A, B = np.meshgrid(alpha, beta)
matrix_assign = np.vectorize(fn.sample_function)(A, B)

Но это всего лишь удобная функция, у которой нет преимущества по времени по сравнению с циклами for.

1
Daniel F 10 Ноя 2020 в 10:07

В общем, это ufunc.outer операция. К сожалению, это работает только с ufunc. Вычитание - это ufunc, но не остальная часть вашей операции. Сделать это можно так:

matrix_assign = np.abs(np.subtract.outer(alpha, beta))

Но в обобщенном виде вам нужно убедиться, что ваш fn.sample_function либо состоит из, либо настроен на (как пользовательский ufunc или np.frompyfunc), только ufunc.

0
Daniel F 10 Ноя 2020 в 09:14