Ваши операторы if и левые части ваших операторов присваивания содержат ссылки на массив, который вы изменяете в цикле.Это означает, что не будет общего способа преобразовать ваш цикл в операции с массивами.Таким образом, вы застряли с каким-то циклом for.
Если бы вместо этого у вас был более простой цикл:
for j in range(0, n):
for i in range(j, -1, -1):
if j - i == 0:
opt[i, j] = 1
elif j - i == 1:
opt[i, j] = 2
elif s[i] == s[j]:
opt[i, j] = 3
else:
opt[i, j] = 4
, вы могли бы создавать логические массивы (используя некоторые вещание ), которые представляют три ваших условия:
import numpy as np
# get arrays i and j that represent the row and column indices
i,j = np.ogrid[:n, :n]
# construct an array with the characters from s
sarr = np.fromiter(s, dtype='U1').reshape(1, -1)
cond1 = i==j # result will be a bool arr with True wherever row index equals column index
cond2 = j==i+1 # result will be a bool arr with True wherever col index equals (row index + 1)
cond3 = sarr==sarr.T # result will be a bool arr with True wherever s[i]==s[j]
Затем вы можете использовать numpy.select
для построения желаемого opt
:
opt = np.select([cond1, cond2, cond3], [1, 2, 3], default=4)
Для n=5
и s='abbca'
, это даст:
array([[1, 2, 4, 4, 3],
[4, 1, 2, 4, 4],
[4, 3, 1, 2, 4],
[4, 4, 4, 1, 2],
[3, 4, 4, 4, 1]])