Входной массив равен x с размерами (1 x 3), а выходной массив равен 3 x 3 (столбец ввода x столбец ввода). Диагонали выходного массива — это значения^2. Если строка != столбец, то для каждого значения используется формула x(строка)+x(столбец). В настоящее время для 1 x 3, но в качестве входных данных следует использовать различные размеры. Невозможно использовать 'def'. Текущий код не работает, что посоветуете?

x = np.array([[0, 5, 10]])
output array formulas = 
[[i^2,   x(row)+x(col),  x(row)+x(col)]
 [x(row)+x(col), i^2,    x(row)+x(col)]
 [x(row)+x(col), x(row)+x(col),   i^2]]

# where row and column refer to the output matrix row, column. For example, the value in (1,2) is x(1)+x(2)= 5

ideal output = 
[[0 5 10]
 [5 25  15]
 [10 15 100]]

Попытка кода:

x = np.array([[0, 5, 10]])
r, c = np.shape(x)
results = np.zeros((c, c))
g[range(c), range(c)] = x**2
for i in x:
    for j in i:
        results[i,j] = x[i]+x[j]
1
sarah 19 Янв 2022 в 19:44
Почему бы просто не что-то вроде: [n[i][j]**2 if i == j else n[i][j] for j in i for i in n]. (очевидно, вам нужно будет получить фактические индексы i и j, поэтому этот код является просто примером алгоритма. Но вы можете использовать enumerate())
 – 
Eli Harold
19 Янв 2022 в 19:48
@EliHarold, я пробовал это, но получаю сообщение об ошибке: ValueError: истинное значение массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all(). Можете ли вы показать пример с данным массивом x?
 – 
sarah
19 Янв 2022 в 19:50
1
См. мой ответ, я закодировал то, что упомянул.
 – 
Eli Harold
19 Янв 2022 в 20:00

3 ответа

Научитесь использовать методы numpy и вещание:

>>> x
array([[ 0,  5, 10]])
>>> x.T
array([[ 0],
       [ 5],
       [10]])
>>> x.T + x
array([[ 0,  5, 10],
       [ 5, 10, 15],
       [10, 15, 20]])
>>> result = x.T + x
>>> result
array([[ 0,  5, 10],
       [ 5, 10, 15],
       [10, 15, 20]])

Тогда этот удобный встроенный:

>>> np.fill_diagonal(result, x**2)
>>> result
array([[  0,   5,  10],
       [  5,  25,  15],
       [ 10,  15, 100]])

Может заменить results[range(c), range(c)] = x**2

0
juanpa.arrivillaga 19 Янв 2022 в 19:55

Вот как вы можете сделать это без использования numpy:

x = [[0,5,10] for i in range(3)]
output = [[x[i][j]**2 if i == j else x[i][j] for j,b in enumerate(a)] for i,a in enumerate(x)]
print(output)

Выход:

[[0, 5, 10], [0, 25, 10], [0, 5, 100]]
0
Eli Harold 19 Янв 2022 в 19:57
Если я сделаю первую строку, это не сработает, потому что [0, 5, 10] — это массив в исходном вводе. Если я делаю x = [[0,5,10] для i в диапазоне (3)], то вывод будет [массив ([ 0, 5, 10]), массив ([ 0, 5, 10]), массив ( [ 0, 5, 10])]... как мы можем настроить первую строку для ввода массива?
 – 
sarah
19 Янв 2022 в 20:25

Попробуй это:

x.repeat(x.shape[1], axis=0)
x = x+x.T
x[np.arange(len(x)),np.arange(len(x))] = (np.diag(x)/2)**2
0
Daniele Bianco 19 Янв 2022 в 20:00