Есть ли векторизованный подход для условного доступа к элементам в тензоре Numpy по матрице и строке? - PullRequest
0 голосов
/ 27 мая 2020

Извините, я еще не очень хорошо знаком с python, так что это может быть элементарный вопрос. Было интересно, существует ли векторизованный подход для условного доступа к элементам в тензоре Numpy по матрице или по строке?

Допустим, у вас есть 3 * 10 * 10 Numpy Array X, где X = [A, B, C]

np.where(X==j)

вернет что-то вроде этого:

> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]),
> 
> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 2, 2, 4, 4, 4]),
> 
> array([5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 3, 6, 3, 7, 0, 3, 6]))

Строка j, занимаемая вместе с целым значением j, составляет состояние. R - это матрица 10 * 10, состоящая из единиц и -1, используемая для вычисления значения состояния. Значение State получается с указанным выше индексом. например,

Состояние (0, j) = (R [0] [5] + R [0] [2] + R [0] [3] + R [0] [6]) / 4

state0j= np.mean(np.array(R[0][5],R[0][2],R[0][3],R[0][6]))

Эти значения будут храниться в матрице S 10 * 10, так что:

 S[0][A[0]==j]= np.mean(np.array(R[0][5],R[0][2],R[0][3],R[0][6]))
 S[2][A[2]==j]= np.mean(np.array(R[2][5],R[2][3],R[2][7])) 
 S[4][A[4]==j]= np.mean(np.array(R[4][5],R[4][0],R[4][3],R[4][6]))

Учитывая, что S (0, J)! = S ( 2, J), т.е. результат j зависит от строки, есть ли способ вычислить S (k, j) для всех k и j, кроме обхода каждой из трех матриц строка за строкой?

Прямо сейчас у меня очень вложенная l oop ситуация, например:

первый l oop через все матрицы в тензоре

States=[]
for matrix in X:
    S=np.zeros(10*10) 

затем l oop по всем уникальным значениям каждой матрицы

    for j in np.unique(matrix):  
              place=np.where(matrix==j)

наконец I l oop по всем строкам найдено значение

              for row in np.unique(place[0]):  
                  S[row][A[row]==j]=np.mean(R[row][matrix[row]==j])
    States.append(S)
States=np.stack(States)
StateValue=np.mean(States,axis=0) 

Последняя строка индексируется как A, потому что это исходная позиция j. Есть ли более быстрый или более быстрый способ sh на pythoni c выполнить это?

...